你沒有在你的例子中使用位置參數。所以相關的代碼是:
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.x
或a.y
分別獲得價值1或2。
所以,這是第4行呢:
self.__dict__ = self
等同於:
a.__dict__ = a where a = {'x':1, 'y':2}
然後我可以叫a.x
和a.y
。
希望不是太亂。
這是泄漏內存的好方法。請參閱http://bugs.python.org/issue1469629以獲取解釋和更好的選擇。 – 2010-09-20 22:09:05