名称修饰
java和C#等其他高级语言中都有private关键字来修饰一个属性或字段是私有的,但是python中并没有private,而是有个与它接近的概念旧式名称修饰。每当在一个属性前面加上__前缀,解释器就会立刻将其重命名:
直接访问会抛异常
利用dir函数查看内部属性
python内部会把__前缀的属性重命名为【_类名+属性名】;因此在python中如果一个属性不是共有的就约定使用双下划线__为前缀,它不会调用任何名称修饰的算法,只是说名这个属性是该类的私有属性。
幸运的是python中还有其他机制类构建类的私有和共有代码,即使用描述符和property这些POP设计的关键特性
插一个小知识点,python中dir和__dict__的区别:https://www.cnblogs.com/zjchao/p/7894477.html
描述符
什么是描述符
python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有 __get__(), __set__(), 和__delete__()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符
它是一个类,定义了另一个类的访问方式,即一个类可以将属性管理托管给另一个类
描述符协议
描述符类基于3个特殊方法,这3个方法组成了描述符协议
-
- __set__(self,obj,type=none)设置属性时调用,也称为setter
- __get__(self,obj,value) 读取属性时调用,也称为getter
- __delete__(self,obj) 对象调用del时调用这一方法
数据描述符
实现了__get__()和__set__()的描述符称为数据描述符
非数据描述符
只实现了__get__()
属性查找顺序
在每次查找属性时,描述符协议的方法实际上是有对象的特殊方法__getattribute__()调用(不是__getattr__()),每次通过点号(instance.attribute)或者getattr(instance,'attribute')函数来执行查找时,都会隐式的调用__getattribute__(),它按下列属性查找该属性:
①.实例属性
②.类属性
③.父类属性
④.__getattr__()方法
https://www.cnblogs.com/Jimmy1988/p/6808237.html