python中只有元類的__getattr__方法纔會執行以下代碼:
def __getattribute__(self, key):
"Emulate type_getattro() in Objects/typeobject.c"
v = object.__getattribute__(self, key)
if hasattr(v, '__get__'):
return v.__get__(None, self)
return v
以上是模擬type的__getattr__方法。所有元類都繼承自type,也就是所有類對象都擁有type的獲取屬性的方法機制,所以,類對象__get__方法會生效,當一個對象作爲type對象的也就是類對象的屬性時,這個對象的__get__方法纔會被執行,否則將不會被執行。
也就是type對象--類對象在訪問它的屬性時,如果它的屬性擁有__get__方法,則會被執行,沒有則不執行。
__get__方法會傳入兩個參數,一個就是訪問它的實例對象,沒有就是None,另一個就是該實例對應的類對象,沒有就爲None。
我們根據這兩個參數就可以知道是誰在訪問它--這個擁有__get__屬性的對象。