python中类的私有成员的 name managing

在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值