zoukankan      html  css  js  c++  java
  • 双下划线私有变量,继承深入了解

    首先来看私有函数

    #encoding=utf-8
    class A(object):
      def __init__(self):
        self.__private()
        self.public()
      def __private(self):
        print 'A.__private()'
      def public(self):
        print 'A.public()'
    class B(A):
      def __private(self):
        print 'B.__private()'

      def public(self):
        print 'B.public()'

      

    b=B()

    输出结果:

    A.__private()

    B.public()

    这是因为类A定义了一个私有成员函数(变量),所以在代码生成之前先执行私有变量轧压(注意到上一节标红的那行字没有?)。轧压之后,类A的代码就变成这样了:
    class A(object):
      def __init__(self):
        self._A__private() # 这行变了
        self.public()
      def _A__private(self): # 这行也变了
        print 'A.__private()'
      def public(self):
        print 'A.public()'
    因为在类B定义的时候没有覆盖__init__方法,所以调用的仍然是A.__init__,即执行了self._A__private(),自然输出“A.__private()”了。

    如果给B添加一个 __init__方法

    class B(A):
      def __init__(self):
        self.__private()
        self.public()
        
      def __private(self):
        print 'B.__private()'

      def public(self):
        print 'B.public()'

      

    则结果就变为了

    B.__private()

    B.public()

    接下来添加一个变量分别

    #encoding=utf-8

    class A(object):
      def __init__(self):
        self.__private()
        self.public()
      def __private(self):
        print 'A.__private()'
      def public(self):
        print 'A.public()'
    class B(A):
      def __init__(self):
        self.__private()
        self.public()
        self.__name='Gar'
      
      def __private(self):
        print 'B.__private()'

      def public(self):
        print 'B.public()'

      def myname(self):
        print self.__name

    b=B()

    '''
    A.__private()
    B.public()
    '''
    b.myname()#Gar,参数必须在特意调用,可以直接由class内部直接用__name来进行调用
    b.__name#'B' object has no attribute '__name2'
    不能直接通过__name访问变量,可以通过其内部的函数访问

    b._B__name#Gar

    或者通过这个方式访问变量

    还有一点就是继承问题,将hehe函数的__init__注释掉的话是什么都不会出现的,想要做继承,则必须要init变量或函数,才能在继承函数中被继承

    class hehe():
    def __init__(self):
    self.hh()


    def hh(self):
    print "hehe"

    class haha(hehe):
    def aa(self):
    print "haha"

    haha()#hehe
    #没有init函数是不会有继承的

  • 相关阅读:
    使用js打开和关闭窗体的几种方法
    使用代码格式化word文档
    批量删除.svn文件的方法
    创业公司老板管理常识
    Google Chrome Source Code 浏览器源码(下载)
    uboot_smdkv210 分析七:Makefile详解
    uboot_smdkv210 分析四:启动代码汇编部分总结
    uboot_smdkv210 分析八:MMU地址映射
    uboot_smdkv210 分析六:内存分配
    uboot_smdkv210 分析五:硬件启动过程
  • 原文地址:https://www.cnblogs.com/garvicker/p/9528657.html
Copyright © 2011-2022 走看看