我想實現一個類換行 - 不是子類 - python dict
對象,以便當在後臺存儲中檢測到更改時,我可以重新創建委託的dict對象。我打算在每次訪問字典進行讀取時檢查後備存儲器中的更改。如何包裝python字典?
假設我要創建一個對象來執行此操作;我需要實施哪些方法?
我想實現一個類換行 - 不是子類 - python dict
對象,以便當在後臺存儲中檢測到更改時,我可以重新創建委託的dict對象。我打算在每次訪問字典進行讀取時檢查後備存儲器中的更改。如何包裝python字典?
假設我要創建一個對象來執行此操作;我需要實施哪些方法?
你也可以繼承的ABC(抽象基類)collections.Mapping
(或collections.MutableMapping
如果您還想允許使用情況來改變模擬/包裹詞典,例如,通過索引分配,pop
等代碼)。
如果這樣做的話,因爲我的文檔指出,有些間接的暗示,你需要實現的方法是
__len__
__iter__
__getitem__
(對於Mapping
) - 你應該也實施
__contains__
因爲通過委託給你包裝它的字典可以做得比ABC不得不應用迭代方法快得多。
如果您需要提供一個MutableMapping
,那麼你還需要實現2種方法:
__setitem__
__delitem__
我認爲這取決於您所使用的方法。可能__getitem__
,__setitem__
,__iter__
和__len__
,因爲大多數事情可以用這些方式來實現。但是你會想看看一些用例,特別是__iter__
。事情是這樣的:
for key in wrapped_dictionary:
do_something(wrapped_dictionary[key])
...將是緩慢的,如果你打在每個迭代的數據源,更何況,如果數據源是從下你變幻出它甚至可能沒有工作。因此,您可能希望在那裏拋出某種異常,並實施iteritems
作爲替代方法,在循環播放之前將所有鍵值對加載到一個批處理中。
除了已經建議的內容之外,您可能還想看看UserDict。
對於類似於dict的對象的示例,您可以閱讀django的session implementation,特別是SessionBase
類。
正如所提供的文檔鏈接所示,UserDict幾乎被dict子類(自Python 2.2以來)和Alex Martelli(自Python 2.6以來)建議的ABC方法所取代。 – NeilenMarais 2014-11-28 14:12:14
在python 3中,有沒有辦法「批量」轉發所有這些方法,而無需爲每個方法手動複製/粘貼幾乎相同的代碼?普通的'__getattr__'不起作用,因爲在類而不是實例上查找了特殊的方法,並且該查找跳過了__getattr__。 – max 2016-11-11 23:42:01