Подтвердить что ты не робот

Наследование Python: TypeError: объект.__ init __() не принимает параметров

Я получаю эту ошибку:

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')
4b9b3361

Ответ 1

Вы вызываете неправильное имя класса в вызове super():

class SimpleHelloWorld(IRCReplyModule):

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

По сути, вы решаете, что это __init__ базового класса объекта, который не принимает никаких параметров.

Его немного избыточно, я знаю, нужно указать класс, в котором вы уже находитесь, поэтому в python3 вы можете просто сделать: super().__init__()

Ответ 2

Это недавно укусило меня дважды (я знаю, что я должен был учиться на своей ошибке в первый раз), и принятый ответ не помог мне ни разу, так что, хотя это свежо в моей памяти, я подумал, что на всякий случай предоставлю свой ответ кто-нибудь еще сталкивается с этим (или мне нужно это снова в будущем).

В моем случае проблема заключалась в том, что я передавал kwarg в инициализацию подкласса, но в суперклассе это ключевое слово arg затем передавалось через вызов super().

Я всегда думаю, что такие вещи лучше всего на примере:

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

Поэтому для решения этой проблемы мне просто нужно изменить порядок, в котором я выполняю действия в методе Foo.__ 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