__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getattr__可以用在python的所有版本中,而__getattribute__只可以用到新类型类中(New-style class),其主要的区别是__getattr__只截取类中未定义的属性,而__getattribute__可以截取所有属性,下面用代码进行说明:
(1)__getattr__
class c: def __init__(self,value): self.data=value def __getattr__(self,name): print('getattr...\n intercept %s'% name) @property def p(self): print(" i'm not intercepted, so you can see me")
>>> x.data 1 >>> x.a getattr... intercept a >>> x.b getattr... intercept b >>> x.p i'm not intercepted, so you can see me
从上面可以看出,对于类c中已定义的实例属性data,p,均显示了出来,而对于未定义的a,b都进行了拦截。
(2)__getattribute__函数
将上面的代码中的__getattr__换成__getattribute__,其他的不做变动
>>> class c: def __init__(self,value): self.data=value def __getattribute__(self,name): print('getattr...\n intercept %s'% name) @property def p(self): print(" i'm intercepted, so you can not see me")
>>> x=c(2) >>> x.a getattr... intercept a >>> x.b getattr... intercept b >>> x.p getattr... intercept p >>> x.data getattr... intercept data
调用实例的属性,可以发现,全部被__getattrbute__予以了拦截。