पायथन वंशानुक्रम: TypeError: object .__ init __ () कोई पैरामीटर नहीं लेता है


90

मुझे यह त्रुटि मिली:

TypeError: object.__init__() takes no parameters 

अपना कोड चलाते समय, मैं वास्तव में यह नहीं देखता कि मैं यहां क्या गलत कर रहा हूं:

class IRCReplyModule(object):

    activated=True
    moduleHandlerResultList=None
    moduleHandlerCommandlist=None
    modulename=""

    def __init__(self,modulename):
        self.modulename = modulename


class SimpleHelloWorld(IRCReplyModule):

     def __init__(self):
            super(IRCReplyModule,self).__init__('hello world')

जवाबों:


115

आप अपने सुपर () कॉल में गलत श्रेणी का नाम बता रहे हैं:

class SimpleHelloWorld(IRCReplyModule):

     def __init__(self):
            #super(IRCReplyModule,self).__init__('hello world')
            super(SimpleHelloWorld,self).__init__('hello world')

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

यह थोड़ा बेमानी है, मुझे पता है, उस वर्ग को निर्दिष्ट करने के लिए जिसे आप पहले से ही अंदर हैं, यही कारण है कि python3 में आप बस ऐसा कर सकते हैं: super().__init__()


4
@LucasKauffman: वास्तव में मुझे इसके बारे में बहुत मूर्खतापूर्ण नहीं लगता। यह आसानी से एक भ्रामक अवधारणा हो सकती है। मैं तुम्हें दोष नहीं देता।
जेडी

4
कई पायथोनियन लोगों को अपमानित करने के जोखिम में: वह - इम्हो - भयानक भाषा डिजाइन है। आपकी मदद के लिए धन्यवाद @jdi!
जोहान्स फारेनक्रग

4
@JohannesFahrenkrug - मुझे नहीं लगता कि आप, किसी को भी अपमान है, क्योंकि यह एक बुरी डिजाइन के रूप में पहचान की गई थी और python3 में ठीक किया गया है: docs.python.org/3/library/functions.html#super
JDI

3

इसने मुझे हाल ही में दो बार काट लिया है (मुझे पता है कि मुझे पहली बार अपनी गलती से सीख लेनी चाहिए थी) और स्वीकृत उत्तर ने मुझे या तो समय पर मदद नहीं की है जबकि यह मेरे दिमाग में ताजा है मैंने सोचा कि मैं सिर्फ मामले में अपना जवाब प्रस्तुत करूंगा। कोई और इस में भाग रहा है (या मुझे भविष्य में फिर से इसकी आवश्यकता है)।

मेरे मामले में मुद्दा यह था कि मैं उपवर्ग के प्रारंभिककरण में एक kwarg पारित कर रहा था, लेकिन सुपरक्लास में तब कीवर्ड arg को सुपर () कॉल में पारित किया जा रहा था।

मुझे हमेशा लगता है कि इस प्रकार की चीजें एक उदाहरण के साथ सबसे अच्छी हैं:

class Foo(object):
  def __init__(self, required_param_1, *args, **kwargs):
    super(Foo, self).__init__(*args, **kwargs)
    self.required_param = required_param_1
    self.some_named_optional_param = kwargs.pop('named_optional_param', None)

  def some_other_method(self):
    raise NotImplementedException

class Bar(Foo):
  def some_other_method(self):
    print('Do some magic')


Bar(42) # no error
Bar(42, named_optional_param={'xyz': 123}) # raises TypeError: object.__init__() takes no parameters

इसलिए इसे हल करने के लिए मुझे केवल उस क्रम को बदलने की आवश्यकता है जो मैं फू .__ init__ विधि में करता हूं; उदाहरण के लिए:

class Foo(object):
  def __init__(self, required_param_1, *args, **kwargs):
    self.some_named_optional_param = kwargs.pop('named_optional_param', None)
    # call super only AFTER poping the kwargs
    super(Foo, self).__init__(*args, **kwargs)
    self.required_param = required_param_1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.