2010-08-02 19 views
8

मैं एक कक्षा को कार्यान्वित करना चाहता हूं जो रैप - सबक्लास - पायथन dict ऑब्जेक्ट नहीं है, ताकि जब बैकिंग स्टोर में कोई परिवर्तन पता चला हो, तो मैं प्रतिनिधि निर्देश वस्तु को फिर से बना सकता हूं। जब भी शिक्षक को पढ़ने के लिए उपयोग किया जाता है, तो मैं बैकिंग स्टोर में बदलावों की जांच करना चाहता हूं।एक पायथन dict कैसे लपेटें?

मान लीजिए कि मैं इस तरह कार्य करने के लिए एक वस्तु बनाना था; मुझे किस तरीकों को लागू करने की आवश्यकता होगी?

उत्तर

12

आप उपवर्ग कर सकते हैं ABC (सार आधार वर्ग) collections.Mapping (या collections.MutableMapping अगर आप भी नकली/लिपटे शब्दकोश को बदलने के लिए उदाहरण के लिए अनुक्रमित असाइनमेंट, pop, आदि के आधार पर आपके उदाहरणों का प्रयोग करते कोड अनुमति देना चाहते हैं)।

आप ऐसा है तो, डॉक्स के रूप में मैं कुछ हद तक परोक्ष रूप से संकेत की ओर इशारा करते हैं, तो तरीकों क्रियान्वित करना चाहिए रहे हैं

__len__ 
__iter__ 
__getitem__ 
(एक Mapping के लिए)

- आप भी

को लागू करना चाहिए
__contains__ 

क्योंकि जिस रैंक को आप लपेट रहे हैं उसे सौंपकर इसे एबीसी को अन्यथा लागू करने के लिए पुनरावृत्ति दृष्टिकोण से बहुत तेज किया जा सकता है।

__setitem__ 
__delitem__  
+0

क्या कोई तरीका है, पाइथन 3 में, उन सभी विधियों को "थोक में" अग्रेषित करने के लिए, उनमें से प्रत्येक के लिए मैन्युअल रूप से लगभग समान कोड कॉपी/पेस्ट किए बिना? सामान्य '__getattr__' काम नहीं करता है क्योंकि उदाहरण के बजाए कक्षा पर विशेष तरीकों को देखा जाता है, और वह लुकअप '__getattr__' छोड़ देता है। – max

1

मैं इसे जो विधि का उपयोग पर निर्भर करता है लगता है:

आप एक MutableMapping आपूर्ति की जरूरत है, तो आप भी 2 अधिक तरीकों को लागू करने की जरूरत है। शायद __getitem__, __setitem__, __iter__ और __len__ क्योंकि अधिकांश चीजों को उन लोगों के संदर्भ में लागू किया जा सकता है। लेकिन आप कुछ उपयोग मामलों को देखना चाहेंगे, खासकर __iter__ के साथ। कुछ इस तरह:

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

... यदि आप प्रत्येक यात्रा पर डेटा स्रोत मारा, कि यह भले ही डेटा स्रोत आप के नीचे से बाहर बदल रहा है काम नहीं कर सकते का उल्लेख नहीं करने के लिए धीमी गति से होने जा रहा है। तो आप शायद कुछ प्रकार के अपवाद फेंकना चाहेंगे और iteritems को एक विकल्प के रूप में कार्यान्वित करना चाहते हैं, इससे पहले कि आप उन पर लूप करने से पहले एक बैच में सभी की-वैल्यू जोड़े लोड कर सकें।

Pythondocs में आइटम लिस्टिंग है जहां आप विधियों और उपयोग-मामलों के लिए देख सकते हैं।

2

जो पहले से ही सुझाया गया है इसके अलावा, आप UserDict पर एक नज़र डालना चाहेंगे।

ऑब्जेक्ट जैसे किसी नियम के उदाहरण के लिए, आप django के session implementation, विशेष रूप से SessionBase कक्षा के माध्यम से पढ़ सकते हैं।

+0

जैसा कि आपूर्ति किए गए प्रलेखन लिंक द्वारा सुझाए गए अनुसार, उपयोगकर्ता डिक्ट्री ने बहुत अधिक मात्रा में उप-वर्गों (पायथन 2.2 के बाद) और एबीसी दृष्टिकोण को एलेक्स मार्टेलि द्वारा सुझाए गए एबीसी दृष्टिकोण (पायथन 2.6 के बाद) द्वारा बहुत अधिक आपूर्ति की है। – NeilenMarais

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