2015-12-20 6 views
10

私はdictをサブクラス化し、すべての変更を検出する必要があります。dictの変更を検出する方法は?

(私が格納された値自体の変更を検出することはできません知っているそれはOKです。)

マイコード:

def __setitem__(self, key, value): 
    super().__setitem__(key, value) 
    self.modified = True 

def __delitem__(self, key): 
    super().__delitem__(key) 
    self.modified = True 

を問題はそれだけで簡単な割り当てや削除のために働くです。 pop(),popitem(),clear()およびupdate()によって行われた変更は検出されません。

__setitem__および__delitem__は、アイテムの追加または削除時にバイパスされるのはなぜですか?これらのメソッド(popなど)も再定義する必要がありますか?

+0

私はここに関連する質問を見つけました:http://stackoverflow.com/questions/7148419/subclass-dict-userdict-dict-or-abc – VPfB

答えて

6

dictクラスをサブクラス化するのではなく、代わりに抽象クラスをPython標準ライブラリのcollectionsモジュールとして使用してください。

あなたはMutableMapping抽象クラスをサブクラス化して、次のメソッドオーバーライドする必要があります。内側の辞書を使って、すべてのことを__getitem____setitem____delitem____iter____len__を、 。抽象基本クラスは、他のすべてのメソッドがそれらを使用することを保証します。

class MyDict(collections.MutableMapping): 
    def __init__(self): 
     self.d = {} 
     # other initializations ... 

    def __setitem__(self, key, value): 
     self.d[key] = value 
     self.modified = true 
    ... 
+0

はあなたの提案をいただき、ありがとうございます。私はそれをテストしました。 'collections.UserDict'からサブクラス化して' MutableMapping'を継承した場合、私の元のコードはそれ以上修正することなく期待どおりに動作します。問題が解決しました。 – VPfB

1

pop, popitem, clear, update__setitem____delitem__で実装されていません。

これらも再定義する必要があります。

私はOrderedDictの実装を見ることができます。

関連する問題