"__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