python中类的私有成员的 name managing

来源:互联网 发布:法里内利 知乎 编辑:程序博客网 时间:2024/06/06 04:17

在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私有化的理解,欢迎拍砖指正!

1 0