我讀了一些python的對象屬性查找(這裏:https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/#object-attribute-lookup)。Python 3 __getattribute__ vs點訪問行爲
似乎很直截了當,所以我想它(python3):
class A:
def __getattr__(self, attr):
return (1,2,3)
a = A()
a.foobar #returns (1,2,3) as expected
a.__getattribute__('foobar') # raises AttributeError
我的問題是沒有這兩個應該DIBE相同?
爲什麼第二個出現屬性錯誤?
顯然,答案是a.foobar
的邏輯與a.__getattribute("foobar")
的邏輯不同。根據data model:a.foobar
調用a.__getattribute("foobar")
,如果它引發AttributeError,它會調用a.-__getattr__('foobar')
所以看起來文章在他們的圖中有一個錯誤。它是否正確?
另一個問題:a.foobar的真實邏輯在哪裏?我認爲這是在__getattribute__
,但顯然不完全。
編輯: 不是
Difference between __getattr__ vs __getattribute__重複。 我在這裏問的是object.foo
和object.__getattribute__("foo")
之間有什麼不同。這不同於__getattr__
與__getatribute__
這是微不足道的...
請先參考官方文檔:https://docs.python.org/3.5/reference/datamodel.html#object.__getattribute__ – thodnev
將'a .__ getattribute __('foobar')'改爲'a .__ getattr __('foobar ')'看看會發生什麼。 – DeepSpace
對此不感興趣......'__getattribute__'應該最終調用'__getattr__'。 'a.foobar'應該叫'__getattribute__'爲什麼? – deller