2015-12-20 7 views
10

मैंने dict को उपclassed है और इसके सभी संशोधनों का पता लगाने की आवश्यकता है।dict संशोधन का पता लगाने के लिए कैसे?

(मैं जानता हूँ कि मैं एक संग्रहीत मूल्य का इन-जगह संशोधन पहचान नहीं कर सकता यह ठीक है।।)

मेरे कोड:

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 कक्षा उप-वर्ग नहीं करना चाहिए, बल्कि इसके बजाय अमूर्त वर्गों का उपयोग पाइथन मानक पुस्तकालय के collections मॉड्यूल का उपयोग करें।

आप MutableMapping सार वर्ग उपवर्ग और निम्न विधियों ओवरराइड करना चाहिए: एक आंतरिक dict का उपयोग करके __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

अपने सुझाव के लिए धन्यवाद। मैंने इसका परीक्षण किया। अगर मैं 'संग्रह। यूज़र डिक्ट' से उप-वर्ग करता हूं जो स्वयं को 'म्यूटेबल मैपिंग' से प्राप्त होता है, तो मेरा मूल कोड बिना किसी संशोधन के अपेक्षित काम करता है। समस्या सुलझ गयी। – VPfB

1

pop, popitem, clear, update__setitem__ और __delitem__ के माध्यम से लागू नहीं किया गया है।

आपको उन्हें फिर से परिभाषित करना होगा।

मैं ऑर्डर्ड डिक्ट कार्यान्वयन को देखने का सुझाव दे सकता हूं।

संबंधित मुद्दे