在Python中没有真正的私有化!
这句话是重点,即使是私有成员,在类外部通过obj._className__attrName 也可以访问的到。
况且,Python对这些以两个_,开头的成员名称进行了改变,变为_className__attrName.
而这也解释了下边这个奇怪的现象。
代码如下:
#coding=utf-8
'''
继承中的name manager
即:python会对私有成员进行了名称改编
'''
class A(object):
__x = 90
def __init__(self):
self.__priv() # 实际保存的是_A__priv()
self.pub()
print self.__x
def __priv(self): # 实际保存的是_A__priv()
print("private A")
def pub(self):
print("public A")
class B(A):
def __priv(self): # 实际保存的是_B__priv()
print("private B")
def pub(self):
print("public B")
if __name__ == '__main__':
b = B()
print '\n'.join(dir(b))
按正常的面向对象语言中,子类不存在构造函数__init__时,应该访问的父类的构造函数,如上边的代码,首先
self.pub()访问到B类的pub()方法,这个正常,但是,self.__priv() 却访问到了A类的__priv();这时就出现name managing这个机制了,其实父类构造函数中的self.__priv() 等价于self._A__priv();[进行了名称改编吗],所以访问到
A类的__priv()也就理所当然了。
另外,在上边代码的最后输出了b对象的成员属性,看到的私有方法__priv()也是_B__priv(),
更奇怪的时在b对象的可访问字典里,竟然有_A__priv()、_A__x,[这些不是私有的吗,怎么会在b的字典里出现],这可能就是开头那句话,Python中没有真正的私有化。
个人对Python私有化的理解,欢迎拍砖指正!