web-dev-qa-db-fra.com

Python héritage: TypeError: object .__ init __ () ne prend aucun paramètre

Je reçois cette erreur:

TypeError: object.__init__() takes no parameters 

lors de l'exécution de mon code, je ne vois pas vraiment ce que je fais mal ici:

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')
74
Lucas Kauffman

Vous appelez le mauvais nom de classe dans votre appel super ():

class SimpleHelloWorld(IRCReplyModule):

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

Essentiellement, ce que vous résolvez est le __init__ De la classe de base d'objet qui ne prend aucun paramètre.

C'est un peu redondant, je sais, de devoir spécifier la classe dans laquelle vous vous trouvez déjà, c'est pourquoi en python3 vous pouvez simplement faire: super().__init__()

96
jdi

Cela m'a mordu deux fois récemment (je sais que j'aurais dû apprendre de mon erreur la première fois) et la réponse acceptée ne m'a pas aidé non plus, alors même si elle est fraîche dans mon esprit, j'ai pensé que je soumettrais ma propre réponse juste au cas où quelqu'un d'autre se heurte à cela (ou j'en aurai besoin à nouveau à l'avenir).

Dans mon cas, le problème était que je passais un kwarg dans l'initialisation de la sous-classe, mais dans la superclasse ce mot-clé arg était ensuite passé dans l'appel super ().

Je pense toujours que ces types de choses sont les meilleurs avec un exemple:

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

Donc, pour résoudre ce problème, il me suffit de modifier l'ordre dans lequel je fais les choses dans la méthode Foo .__ init__; par exemple.:

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
1
John