"__getattribute__"方法小结:
1. 任何调用类的属性行为都将从"__getattribute__"开始调用。
2. 在"__getattribute__"中调用该函数自身属性,将会导致无限循环,应该借用object对象再调用其本身。所以如果要在自定义类中重写"__getattribute__"方法,首先该自定
义类必须继承object对象,然后借用object对象再调用其本身返回属性值: return object.__getattribute__(self, name),如果直接调用__getattribute__(self, name)则会
无限递归
以如下两个例子来说明:
--------------------ex1:--------------------
class User(object): # 必须继承object
def __init__(self):
self.Id = 0
def def __getattribute__(self, name):
print 'get '+name
return object.__getattribute__(self, name) # 正常返回属性值 --借用object对象再调用其本身
u=User()
u.Id = 1
print u.Id
---------输出
'get Id '
'1'
----------------------------ex2:---------------------------
class User(object): # 必须继承object
def __init__(self):
self.Id = 0
def def __getattribute__(self, name):
print 'get '+name
return self.__getattribute__(self, name) # 陷入无限递归
u=User()
u.Id = 1
print u.Id
---------输出
'get __getattribute__'
'get __getattribute__'
'get __getattribute__'
'get __getattribute__' . . .. . . . . . .. ..
"__getattr__"方法小结:
1. "__getattr__"将会在寻找不到合适的函数或者属性时作为默认被调用到。
class User(object): # 必须继承object
def __init__(self):
self.Id = 0
def def __getattribute__(self, name):
print 'get '+name
return object.__getattribute__(self, name)
def def __getattr__(self, name):
print 'getattr '+name
return self.__dict__.get(name)
u=User()
print u.Id2
---------输出
'get Id2'
'getattr Id2'
None