(मैं अजगर 2.7 का उपयोग कर रहा) अजगर प्रलेखन इंगित करता है कि आप dict builtin करने के लिए एक मानचित्रण पारित कर सकते हैं और इसे कॉपी जाएगा दर्ज की है कि नए dict में मानचित्रण:अजगर एबीसी: बनाम उपवर्गीकरण
http://docs.python.org/library/stdtypes.html#mapping-types-dict
मैं एक वर्ग है कि मानचित्रण एबीसी को लागू करता है, लेकिन यह विफल रहता है:
import collections
class Mapping(object):
def __init__(self, dict={}): self.dict=dict
def __iter__(self): return iter(self.dict)
def __iter__(self): return iter(self.dict)
def __len__(self): return len(self.dict)
def __contains__(self, value): return value in self.dict
def __getitem__(self, name): return self.dict[name]
m=Mapping({5:5})
dict(m)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
collections.Mapping.register(Mapping)
dict(m)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
हालांकि, अगर मेरी कक्षा उपवर्गों collections.Mapping तो यह ठीक काम करता है:
import collections
class Mapping(collections.Mapping):
def __init__(self, dict={}): self.dict=dict
def __iter__(self): return iter(self.dict)
def __iter__(self): return iter(self.dict)
def __len__(self): return len(self.dict)
def __contains__(self, value): return value in self.dict
def __getitem__(self, name): return self.dict[name]
m=Mapping({5:5})
dict(m)
# {5: 5}
मैंने सोचा कि एबीसी का पूरा बिंदु पंजीकरण को उपclassing (वैसे भी जारी रखने और जारी करने के लिए) के समान काम करने की अनुमति देना था। तो यहाँ क्या हो रहा है?
धन्यवाद! वह जानकारीपूर्ण था। मैं उपclass नहीं करना चाहता था क्योंकि मैं नहीं चाहता कि जब आप subclass करते हैं तो विशेष "मुक्त" विधियां प्राप्त होंगी। मैंने सोचा कि मैंने अपनी कक्षा को इतना कवर किया था कि मैं इसे एक ताना में डाल सकता हूं, लेकिन मैं गलत था। एक बार फिर धन्यवाद। –
@ एरिक, आपका स्वागत है! आपकी कक्षा के एक उदाहरण w/एक उदाहरण को इमिटिंग (या अपडेट करने) के उद्देश्य से मिसने वाली विशिष्ट विधि 'कुंजी' है - http://svn.python.org/view/python/trunk/Objects की सीएफआर लाइन 1411 /dictobject.c?annotate=81029 - 'if (PyObject_HasAttrString (arg," keys ")) '- इस तरह' dict' पता चलता है कि यह मैपिंग या जोड़े के पुनरावृत्त को पारित किया जा रहा है (पूर्व मामले में, लाइन 1567 , फिर यह 'PyMapping_Keys' और c) का उपयोग करेगा। बीटीडब्ल्यू, निर्दोष लेकिन अनावश्यक, आपने दो बार '__iter__' परिभाषित किया। –
जहां तक मैपिंग क्लास जाता है, क्या इसका मतलब यह है कि उचित मैपिंग में मैपिंग के सभी तरीकों, यहां तक कि मुक्त लोगों के लिए भी होना चाहिए? मैं हाँ सोचूंगा, चूंकि कुंजियों के लिए चाबियाँ अपेक्षित थीं। या यह है कि कुंजी चाबियाँ पाने के लिए इस्तेमाल किया जा सकता था? –