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


92

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

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

Ответы:


118

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

class SimpleHelloWorld(IRCReplyModule):

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

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

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


4
@LucasKauffman: На самом деле я не думаю, что это очень глупо с твоей стороны. Это легко может сбивать с толку. Я тебя не виню.
jdi

4
Рискуя оскорбить многих питонианцев: это - имхо - ужасный дизайн языка. Спасибо за помощь @jdi!
Йоханнес Фаренкруг

4
@JohannesFahrenkrug - Я не думаю, что вы кого-нибудь обидите, потому что это было определено как плохой дизайн и исправлено в python3: docs.python.org/3/library/functions.html#super
jdi

3

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

В моем случае проблема заключалась в том, что я передавал 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.