2010-04-14 41 views
11
class attrdict(dict): 
    def __init__(self, *args, **kwargs): 
     dict.__init__(self, *args, **kwargs) 
     self.__dict__ = self 

a = attrdict(x=1, y=2) 
print a.x, a.y 

b = attrdict() 
b.x, b.y = 1, 2 
print b.x, b.y 

有人能解釋前四句話嗎?我讀了關於類和方法。但這裏看起來很混亂。class,dict,self,init,args?

+0

這是泄漏內存的好方法。請參閱http://bugs.python.org/issue1469629以獲取解釋和更好的選擇。 – 2010-09-20 22:09:05

回答

5

你沒有在你的例子中使用位置參數。所以相關的代碼是:

class attrdict(dict): 
    def __init__(self, **kwargs): 
     dict.__init__(self, **kwargs) 
     self.__dict__ = self 

在第一行定義attrdict類爲dict一個子類。 在第二行中,您定義了自動初始化您的實例的函數。您將關鍵字參數(**kargs)傳遞給此函數。當你實例a

a = attrdict(x=1, y=2) 

你實際上是在呼籲

attrdict.__init__(a, {'x':1, 'y':2}) 

字典實例核心初始化通過初始化dict內置超完成。這在第三行完成,傳遞參數attrdict.__init__。 因此,

dict.__init__(self,{'x':1, 'y':2}) 

使得self(實例a)的字典:

self == {'x':1, 'y':2} 

發生在最後一行的好處: 每個實例都有一個辭典保持它的屬性。這是self.__dict__(即a.__dict__)。

例如,如果

a.__dict__ = {'x':1, 'y':2} 

我們可以寫a.xa.y分別獲得價值1或2。

所以,這是第4行呢:

self.__dict__ = self 

等同於:

a.__dict__ = a where a = {'x':1, 'y':2} 

然後我可以叫a.xa.y

希望不是太亂。

+0

比公認的更好。 – Musaffa 2012-06-17 18:35:16

4

這裏有一個很好的文章,解釋__dict__

The Dynamic dict

attrdict類利用,通過從字典中繼承,然後設置對象的__dict__到字典中。因此,對父字典(即它繼承的dict類)發生任何屬性訪問。

本文的其餘部分是相當不錯的太對理解Python對象:

Python Attributes and Methods

7

我在一行一行地解釋拍:

class attrdict(dict): 

這行聲明一個類作爲內置的字典類的一個子類的屬性。

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs) 

這是您的標準__init__方法。對dict.__init__(...)的調用是利用超類 類(在這種情況下,字典)構造函數(__init__)的方法。

最後一行self.__dict__ = self使得它傳遞給__init__方法的關鍵字參數(kwargs)可以像下面代碼中的屬性一樣被訪問,即a.x,a.y。

希望這有助於消除您的困惑。

+0

需要修復'__init__'。把它們反過來,它們看起來就像我的'__init__'。 – 2010-04-14 22:44:35

+0

這非常有幫助。謝謝! – kame 2010-04-15 06:01:27

相關問題