2011-01-28 15 views
6
# Python 3 
class Point(tuple): 
    def __init__(self, x, y): 
     super().__init__((x, y)) 

Point(2, 3) 

समस्या उपवर्गीकरण builtin प्रकार

TypeError: tuple() takes at most 1 argument (2 given)

क्यों में परिणाम होगा? इसके बजाय मुझे क्या करना चाहिए?

+2

संभव डुप्लिकेट (http://stackoverflow.com/questions/1565374/subclassing-python-tuple-with-multiple-init-arguments) –

उत्तर

10

tuple एक अपरिवर्तनीय प्रकार है। यह पहले से ही बनाया गया है और __init__ से पहले अपरिवर्तनीय भी कहा जाता है। यही कारण है कि यह काम नहीं करता है।

यदि आप वास्तव में एक ट्यूपल को उपclass करना चाहते हैं, तो __new__ का उपयोग करें।

>>> class MyTuple(tuple): 
...  def __new__(typ, itr): 
...    seq = [int(x) for x in itr] 
...    return tuple.__new__(typ, seq) 
... 
>>> t = MyTuple((1, 2, 3)) 
>>> t 
(1, 2, 3) 
[कई __init__ तर्क के साथ उपवर्गीकरण अजगर टपल] की
+1

आह, तो मेरे 'प्वाइंट (2,3) '' प्वाइंट' में' __new__' विधि की तलाश में है, इसे ढूंढने में विफल रहता है, 'tuple invokes .__ new __ (प्वाइंट, 2,3)' जो विफल रहता है क्योंकि यह केवल मनमानी संख्या को पास नहीं करता है उपयोगकर्ता द्वारा परिभाषित वर्ग की तरह '__init__' के लिए तर्क होगा, लेकिन वास्तव में' टुपल 'को ठीक से शुरू करने के लिए वास्तव में एक ही इटरेटर की आवश्यकता होती है, सही? कोड 'प्वाइंट .__ init __ (स्वयं, 2, 3)' कॉल तक भी नहीं पहुंचता है; वह कॉल, यदि ऐसा होता है, तो भी गलत होगा क्योंकि 'tuple' में '__init__' नहीं है, और इसलिए' ऑब्जेक्ट .__ init__' चुपचाप कुछ भी नहीं करेगा? – max

+0

हां बिल्कुल। वस्तु पहले से ही बनाई जा चुकी है। – user225312