2015-07-21 38 views
0

我想在透明方式從我的類讀取任何內容之前執行方法(以便調用方在寫入類實例之前不必進行調用)。掛鉤__getattr__很容易,但我不知道如何掛入__dict__,因爲object沒有__dict__屬性。鉤子__dict__在python中的自定義類?

super().__dict__'super' object has no attribute '__dict__'

也許有別的東西我應該做的做到這一點?

+1

也許嘗試掛鉤'__getattribute__'? – Kupiakos

+0

我其實有一個錯誤。我正在用'__getattribute__'混合'_​​_getattr__'。 –

+0

是的,掛鉤'__getattribute__'就足夠了。 –

回答

0

根本不想使用該類的__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 
>>> 
+0

很好的答案!我不知道它是否回答了他的問題,因爲我無法弄清他在問什麼。 :( –

相關問題