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函数是不会有继承的

  • 相关阅读:
    JVM运行参数优化详细教程
    idea 代码热启动配置方法
    Spring MVC拦截器完整代码示例
    Spring MVC异常处理代码完整实例
    Python3基础语法(20190617)
    Java代码生成器Easy Code
    Mybatis @Many注解一对多关联映射
    Mybatis @One注解使用
    Mybatis @ResultMap复用@Result
    Mybatis @Result注解的使用案例
  • 原文地址:https://www.cnblogs.com/garvicker/p/9528657.html
Copyright © 2011-2022 走看看