2013-01-23 23 views
6

इस कोड के साथ क्या गलत है?पायथन अंतर्निर्मित प्रकार

class MyList(list): 
    def __init__(self, li): self = li 

जब मैं साथ MyList का एक उदाहरण बनाने के लिए, उदाहरण के लिए, MyList([1, 2, 3]) के लिए, और फिर मैं इस उदाहरण प्रिंट, सभी मैं एक खाली सूची [] है। यदि MyDictlist उपclassing है, तो MyDictlist नहीं है?

एनबी: पायथन 2.x और 3.x दोनों में।

उत्तर

15

आप सूची प्रारंभकर्ता कॉल करने की आवश्यकता:

class MyList(list): 
    def __init__(self, li): 
     super(MyList, self).__init__(li) 

समारोह में self को नियत बस की सूची के साथ स्थानीय चर को बदल देता है, उदाहरण के लिए कुछ भी आवंटित नहीं:

>>> class MyList(list): 
...  def __init__(self, li): 
...   super(MyList, self).__init__(li) 
... 
>>> ml = MyList([1, 2, 3]) 
>>> ml 
[1, 2, 3] 
>>> len(ml) 
3 
>>> type(ml) 
<class '__main__.MyList'> 
+0

'सूची' से विरासत में प्राप्त होने पर __ init __ (self) 'भी सूचीबद्ध होगा। – Wolf

+0

@ वुल्फ: हाँ, लेकिन यह एकाधिक विरासत को रोक देगा, उदा। इस कक्षा का उपयोग एक और वर्ग के साथ आधार के रूप में करते हुए। ऐसे मामलों में 'सूची' एमआरओ में अगली कक्षा नहीं हो सकती है। –

+0

उस पर इशारा करने के लिए धन्यवाद! संक्षिप्त उत्तर जो मैंने पहले ही पाया है: [* सबक्लासिंग बिल्ट-इन प्रकार *] (http://www.cafepy.com/article/python_attributes_and_methods/ch03s02.html)। * एमआरओ * मुझे आशा है कि मैं * विधि समाधान आदेश * के लिए सही ढंग से हल किया गया है। – Wolf

0

मैं लगा यह मेरे लिए बाहर है: selflist के उप-वर्ग का एक उदाहरण है, इसलिए इसे अभी भी MyList ऑब्जेक्ट होने की सूची में नहीं डाला जा सकता है।

+2

नहीं, 'स्वयं' 'MyList' के उदाहरण का संदर्भ है। पाइथन कास्टिंग नहीं है। मार्टिजन पीटर का जवाब देखें। – chepner

+0

@chepner तकनीकी रूप से सत्य होने पर, यह उन लोगों के लिए भी बहुत आम है जो नामों के संदर्भ/बिंदुओं के बारे में बताते हैं और इस तरह के रिश्ते को व्यक्त करने के लिए उत्परिवर्तनीय बनाम अप्रचलित प्रकारों के प्रभावों के बारे में समझते हैं, "x _is a_ तीन पूर्णांक की सूची "यहां तक ​​कि एक्स को' ए = 7 के रूप में असाइन किया गया था – cfwschmidt

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

  • कोई संबंधित समस्या नहीं^_^