双下划线私有变量,继承深入了解
首先来看私有函数
#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函数是不会有继承的