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

posted @ 2016-05-30 15:29  雅思敏  阅读(1137)  评论(0编辑  收藏  举报