我想在透明方式從我的類讀取任何內容之前執行方法(以便調用方在寫入類實例之前不必進行調用)。掛鉤__getattr__
很容易,但我不知道如何掛入__dict__
,因爲object
沒有__dict__
屬性。鉤子__dict__在python中的自定義類?
super().__dict__
給'super' object has no attribute '__dict__'
也許有別的東西我應該做的做到這一點?
我想在透明方式從我的類讀取任何內容之前執行方法(以便調用方在寫入類實例之前不必進行調用)。掛鉤__getattr__
很容易,但我不知道如何掛入__dict__
,因爲object
沒有__dict__
屬性。鉤子__dict__在python中的自定義類?
super().__dict__
給'super' object has no attribute '__dict__'
也許有別的東西我應該做的做到這一點?
根本不想使用該類的__dict__
在大多數情況下(它在所有實例之間共享,請記住),並且幾乎肯定不會希望超類型的__dict__
,因爲(如您剛剛發現的那樣)不一定有一個。
>>> class One:
... def __init__(self):
... print(super().__dict__)
...
>>> one = One()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
AttributeError: 'super' object has no attribute '__dict__'
正如你彙報,object
沒有自己的__dict__
。這是因爲object
情況下,被內置類型,不準獲得額外的屬性,這樣object
是硬編碼來禁止它:
>>> object().someattr = "hello"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'someattr'
>>>
當你在程序中創建對象的子類,但是,其實例可以具有任意屬性,這些屬性存儲在實例__dict__
中。
>>> class Two:
... def __init__(self):
... print(self.__dict__)
...
>>> two = Two()
{}
>>> two.someattr = "hello"
>>> two.__dict__
{'someattr': 'hello'}
>>>
注意,繼承機制使得Two
類似乎有所有的object
屬性。該dir()
功能讓你看對象的命名空間通過繼承的修改:
>>> dir(Two)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__']
挑選一個隨機屬性,我們可以驗證出現在Two
的方法實際上是從object
繼承:
>>> Two.__delattr__ is object.__delattr__
True
>>>
很好的答案!我不知道它是否回答了他的問題,因爲我無法弄清他在問什麼。 :( –
也許嘗試掛鉤'__getattribute__'? – Kupiakos
我其實有一個錯誤。我正在用'__getattribute__'混合'__getattr__'。 –
是的,掛鉤'__getattribute__'就足夠了。 –