分享

__call__,__getattr__, __setattr__, __delattr__, __get__等等

 Tech-d 2013-12-10
__call__ :把类实例当做函数使用
class ImFunc(object):
def __call__(self,words):
print 'i say %s' % words

if __name__ == '__main__':
imfunc = ImFunc()
imfunc('what the func?') #把类当函数使
===================
__getattr__ :当一个属性在通常的位置没有被找到的时候会被自动调用(如,一个既不是实例本身的属性,又没有通过self在class tree中找到的属性)。返回属性值或抛出AttributeError。

__getattribute__:无条件被调用,通过实例访问属性。若class中定义了__getattr__,这个__getattr__也不会被调用,除非显式地调用或者引发AttributeError后,才会调用__getattr__。

python中,查找属性的顺序是:
1. 首先调用__getattribute__,查找成功则返回结果;
2. 若1查找失败,再调用__getattr__;若仍然查找失败,则报错(自己override方法了除外,会照着代码设定处理);
e.g.
  1. class C(object):  
  2.     a = 'abc'  
  3.     def __getattribute__(self, *args, **kwargs):  
  4.         print("__getattribute__() is called")  
  5.         return object.__getattribute__(self, *args, **kwargs)  
  6. #        return "haha"  
  7.     def __getattr__(self, name):  
  8.         print(name, ": __getattr__() is called ")  
  9.         return name + " from getattr"  
  10.   
  11. if __name__ == '__main__':  
  12.     c = C()  
  13.     print('c.a', c.a)  
  14.     print('c.zz', c.zz)  

运行结果:
c.a : __getattribute__() is called
abc
c.zz : __getattribute__() is called
zz : __getattr__() is called 
zz from getattr

=======================
__setattr__: 当给一个属性设置值的时候会调用的函数,注意没有__setattribute__


=======================
__get__ :如果类定义了它,则这个类就叫做描述器(descriptor),onwer是所有者类,instance是访问描述器的实例,若不通过实例而是通过类来访问的话,则instance为None







    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多