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

首先来看私有函数

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

原文地址:https://www.cnblogs.com/garvicker/p/9528657.html