• 双下划线私有变量,继承深入了解


    首先来看私有函数

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

  • 相关阅读:
    初学网络编程
    Python模块(三)(正则,re,模块与包)
    Python模块(二)(序列化)
    idea2020.2安装与破解
    部署-jenkins发布项目到linux环境
    部署-jenkins发布项目到windows环境
    部署-jenkins与gitlab结合使用
    部署-docker推送镜像到远程仓库
    部署-gitlab克隆地址踩坑
    部署-docker安装jenkins
  • 原文地址:https://www.cnblogs.com/garvicker/p/9528657.html
Copyright © 2020-2023  润新知