2010-08-02 110 views
8

我想實現一個類換行 - 不是子類 - python dict對象,以便當在後臺存儲中檢測到更改時,我可以重新創建委託的dict對象。我打算在每次訪問字典進行讀取時檢查後備存儲器中的更改。如何包裝python字典?

假設我要創建一個對象來執行此操作;我需要實施哪些方法?

回答

12

你也可以繼承的ABC(抽象基類)collections.Mapping(或collections.MutableMapping如果您還想允許使用情況來改變模擬/包裹詞典,例如,通過索引分配,pop等代碼)。

如果這樣做的話,因爲我的文檔指出,有些間接的暗示,你需要實現的方法是

__len__ 
__iter__ 
__getitem__ 

(對於Mapping) - 你應該實施

__contains__ 

因爲通過委託給你包裝它的字典可以做得比ABC不得不應用迭代方法快得多。

如果您需要提供一個MutableMapping,那麼你還需要實現2種方法:

__setitem__ 
__delitem__  
+0

在python 3中,有沒有辦法「批量」轉發所有這些方法,而無需爲每個方法手動複製/粘貼幾乎相同的代碼?普通的'__getattr__'不起作用,因爲在類而不是實例上查找了特殊的方法,並且該查找跳過了__getattr__。 – max 2016-11-11 23:42:01

1

我認爲這取決於您所使用的方法。可能__getitem__,__setitem__,__iter____len__,因爲大多數事情可以用這些方式來實現。但是你會想看看一些用例,特別是__iter__。事情是這樣的:

for key in wrapped_dictionary: 
    do_something(wrapped_dictionary[key]) 

...將是緩慢的,如果你打在每個迭代的數據源,更何況,如果數據源是從下你變幻出它甚至可能沒有工作。因此,您可能希望在那裏拋出某種異常,並實施iteritems作爲替代方法,在循環播放之前將所有鍵值對加載到一個批處理中。

Pythondocs有項目清單,您可以在其中查找方法和用例。

2

除了已經建議的內容之外,您可能還想看看UserDict

對於類似於dict的對象的示例,您可以閱讀django的session implementation,特別是SessionBase類。

+0

正如所提供的文檔鏈接所示,UserDict幾乎被dict子類(自Python 2.2以來)和Alex Martelli(自Python 2.6以來)建議的ABC方法所取代。 – NeilenMarais 2014-11-28 14:12:14