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
- python中类的私有成员的 name managing
- Python类的私有成员
- python 类私有成员
- 访问类的私有成员
- 访问类的私有成员
- 类的私有成员变量和私有成员函数
- 类中私有数据成员的可访问性
- 访问C++类对象中私有成员变量的方法
- C++访问类中私有成员变量的方法
- YTU-OJ-类中私有成员的访问
- YTU 2639: 改错题:类中私有成员的访问
- java中子类能不能继承父类的私有成员
- [YTU]_2639 ( 改错题:类中私有成员的访问)
- 修改私有成员(类成员)/只读成员的属性
- JavaScript的私有成员
- 它的私有成员
- 学习笔记-----关于C++中类的成员函数可以访问私有成员的问题
- 类的私有数据成员的访问
- python3学习笔记:零碎知识点
- register--皇帝身边的小太监(这样的比喻确实挺生动)
- maven学习笔记3------maven规范约束
- Codeforces 151C Win or Freeze 简单博弈+唯一分解
- 机器学习中常用算法总结
- python中类的私有成员的 name managing
- 在Mac终端编译运行cpp格式c++文件
- lvs集群简介
- jdk中的标记性接口
- 城市是否可以坐车到达问题
- 玩一玩微信公众号开发(二) 管理凭据和自定义菜单
- 简述HTTP协议
- 内部排序之交换排序
- MyBatis 的数据库操作