python 内置方法
1.__getattr__:访问不存在的成员
2.__getattribute__:访问成员的时候默认调用该函数,而一般不会调用__getattr__,只有出现异常,才会转到__getattr__处理。如果要重写该函数,不要使用return self.__dict__[name] ,会造成死循环
3.__setattr__:将等式右边的值赋予左边的成员,调用该方法。
4.__get__:描述符必选,(描述符,存在类的__dict__中的属性)如果类的属性有__get__方法,则该属性的值为__get__返回值;def
__get__(
self
, instance, owner),t.d,,T.d,都调用
__get__(
self
, instance, owner)
,前者intance为t,owner为T,后者instance为None,owner为T
5.__set__:描述符可选,t.d = value,实际上调用d.__set__(t, value),T.d = value,这是真正的赋值,T.d的值从此变成value。d不再是描述符,而是value;如果描述符没有__set__函数,则赋值也是直接赋值。
6.__delete__:描述符可选,与设置类似
7.__getitem__:可以像list一样使用下标取得元素
8.abc模块:提供抽象类,设定那些类函数必须实现,也可以通过 __subclasshook__
方法来实现虚拟方法的检查
备注:
python属性查找策略
1.如果attr是一个Python自动产生的属性,找到!(优先级非常高!)
2.查找obj.__class__.__dict__,如果attr存在并且是data descriptor,返回data descriptor的__get__方法的结果,如果没有继续在obj.__class__的父类以及祖先类中寻找data descriptor
3.在obj.__dict__中查找,这一步分两种情况,第一种情况是obj是一个普通实例,找到就直接返回,找不到进行下一步。第二种情况是obj是 一个类,依次在obj和它的父类、祖先类的__dict__中查找,如果找到一个descriptor就返回descriptor的__get__方法的 结果,否则直接返回attr。如果没有找到,进行下一步。
4.在obj.__class__.__dict__中查找,如果找到了一个descriptor(插一句:这里的descriptor一定是non- data descriptor,如果它是data descriptor,第二步就找到它了)descriptor的__get__方法的结果。如果找到一个普通属性,直接返回属性值。如果没找到,进行下 一步。
5.很不幸,Python终于受不了。在这一步,它raise AttributeError
对属性赋值时的查找策略 ,对于obj.attr = value
1.查找obj.__class__.__dict__,如果attr存在并且是一个data descriptor,调用attr的__set__方法,结束。如果不存在,会继续到obj.__class__的父类和祖先类中查找,找到 data descriptor则调用其__set__方法。没找到则进入下一步。
2.直接在obj.__dict__中加入obj.__dict__['attr'] = value