223 votes

super () échoue avec l'erreur suivante: TypeError "l'argument 1 doit être type, pas classobj"

J'ai une erreur que je n'arrive pas à comprendre. Aucun indice sur ce qui ne va pas avec mon exemple de code?

 class B:
    def meth(self, arg):
        print arg

class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)
 

J'ai obtenu le code de test exemple à l'aide de la méthode "super" intégrée. La classe "C" est la

Voici l'erreur:

 Traceback (most recent call last):
  File "./test.py", line 10, in ?
    print C().meth(1)
  File "./test.py", line 8, in meth
    super(C, self).meth(arg)
TypeError: super() argument 1 must be type, not classobj
 

Pour votre information, voici l'aide (super) de python lui-même:

 Help on class super in module __builtin__:

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |          super(C, self).meth(arg)
 |
 

365voto

steveha Points 24808

Votre problème, c'est que la classe B n'est pas déclaré comme un "nouveau style" de la classe. Modifier comme suit:

class B(object):

et il va fonctionner.

super() et toutes les classes/super-classe trucs ne fonctionne qu'avec les nouveau-classes de style. Je vous recommande de prendre l'habitude de toujours taper cette (object) sur toute la définition de la classe pour s'assurer qu'il s'agit d'un nouveau style de classe.

Vieux-classes de style (aussi connu comme "classique" classes) sont toujours de type classobj; nouvelle-classes de style sont de type type. C'est pourquoi vous avez le message d'erreur que vous avez vu:

TypeError: super() argument 1 must be type, not classobj

Essayez ceci pour voir par vous-même:

class OldStyle:
    pass

class NewStyle(object):
    pass

print type(OldStyle)  # prints: <type 'classobj'>

print type(NewStyle) # prints <type 'type'>

Notez que dans Python 3.x, toutes les classes sont nouveau style. Vous pouvez toujours utiliser la syntaxe de l'ancien-classes de style, mais vous obtenir un nouveau type de classe. Donc, en Python 3.x vous n'aurez pas ce problème.

175voto

frmdstryr Points 641

De plus, si vous ne pouvez pas changer de classe B, vous pouvez corriger l'erreur en utilisant un héritage multiple.

 class B:
    def meth(self, arg):
        print arg

class C(B, object):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X