2012-06-24 16 views
24

एक अजगर उपवर्गीकरण dict काम करता है के रूप में उम्मीद:ऑर्डर्ड डिक्ट को कैसे वर्गीकृत करें?

>>> class DictSub(dict): 
...  def __init__(self): 
...   self[1] = 10 
...   
>>> DictSub() 
{1: 10} 

हालांकि, एक collections.OrderedDict साथ ही बात कर काम नहीं करता:

>>> import collections 
>>> class OrdDictSub(collections.OrderedDict): 
...  def __init__(self): 
...   self[1] = 10 
...   
>>> OrdDictSub() 
(…) 
AttributeError: 'OrdDictSub' object has no attribute '_OrderedDict__root' 

इस प्रकार, OrderedDict कार्यान्वयन के लिए एक निजी __root गुण है, जो रोकता है का उपयोग करता है उप-वर्ग OrdDictSubDictSub सबक्लास की तरह व्यवहार करने से। क्यूं कर? ऑर्डर्ड डिक्ट से कैसे प्राप्त किया जा सकता है?

+2

डाउनवोट क्यों? – EOL

उत्तर

33

आप अपने __init__ से OrderedDict.__init__ आह्वान करने के लिए की जरूरत है:

class OrdDictSub(collections.OrderedDict): 
    def __init__(self): 
     super(OrdDictSub, self).__init__() 

आप OrderedDict खुद को प्रारंभ करने का मौका नहीं दिया है। तकनीकी रूप से, आप इसे अपने dict सबक्लास के साथ भी करना चाहते हैं, क्योंकि आप पूरी तरह से dict प्रारंभ करना चाहते हैं। तथ्य यह है कि dict इसके बिना काम करता है बस भाग्य है।

+0

धन्यवाद। मेरा बुरा, वास्तव में। यह सच है कि मैं dict द्वारा प्रभावित था। मैंने कुछ समय पहले dict के बारे में एक प्रश्न भी पूछा (http://stackoverflow.com/questions/2033150/subclassing-dict-should-dict-init-be-called)! – EOL

+6

क्या आप इनिट में तर्क और kwargs नहीं चाहते हैं? 'def __init __ (स्वयं, * तर्क, ** kwargs): सुपर (OrdDictSub, स्वयं) .__ init __ (* args, ** kwargs)' – hobs

2

__init__ विधि में सुपर क्लास आरंभ प्रयास करें:

def __init__(self): 
    collections.OrderedDict.__init__(self) 
    self[1] = 10 

यह एक उपवर्ग को प्रारंभ करने के लिए सामान्य तरीका है। सुपरक्रैस की __init__ विधि सामान्य रूप से कॉल करने के लिए नहीं है, लेकिन अगर आपको सुपरक्लास के कार्यान्वयन का कोई ज्ञान नहीं है तो आपको वास्तव में __init__ पर कॉल करना चाहिए।

+1

सुपरक्लास – astynax

+1

@astynax के कॉल विधियों के लिए 'सुपर() 'का उपयोग करें: दोनों तरीके काम करते हैं, इसलिए यह शैली का विषय है। –

+9

@DietrichEpp: अच्छा जवाब, लेकिन 'सुपर() 'का उपयोग शैली की बात नहीं है: यदि आपकी अपनी कक्षा उप-वर्ग में है तो इसका उपयोग करना महत्वपूर्ण है (एक स्पष्ट सुपरक्लास का उपयोग करने के बजाय)। संदर्भ का उदाहरण: http://rhettinger.wordpress.com/2011/05/26/super-Considered-super/। इसके अलावा, 'सुपर()' का उपयोग करके कोड को बनाए रखने के लिए आसान बनाता है (कक्षा का नाम बदलना आसान है)। – EOL

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