super () échoue avec erreur: TypeError "l'argument 1 doit être type, pas classobj" quand le parent n'hérite pas de l'objet

, j'obtiens une erreur que je ne peux pas comprendre. Vous savez ce qui ne va pas avec mon 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 eu le code de test à 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 info, 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)
 |
134
demandé sur smci 2009-11-11 07:36:05

4 réponses

votre problème est que la Classe B n'est pas déclarée comme une classe" new-style". Changer comme ceci:

class B(object):

et ça marchera.

super() et toutes les sous-classes/superclasses fonctionne uniquement avec des classes de nouveau style. Je vous recommande de prendre l'habitude de toujours taper ce (object) sur n'importe quelle définition de classe pour s'assurer qu'il est un nouveau style de classe.

Les classes

à L'ancienne (également connues sous le nom de classes "classiques") sont toujours type classobj ; les classes new-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 qu'en Python 3.x, toutes les classes sont de style nouveau. Vous pouvez toujours utiliser la syntaxe des anciennes classes, mais vous obtenez une nouvelle classe. Donc, en Python 3.x vous n'aurez pas ce problème.

241
répondu steveha 2011-09-19 03:37:59

aussi, si vous ne pouvez pas changer la Classe B, vous pouvez corriger l'erreur en utilisant l'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)
109
répondu frmdstryr 2014-04-30 15:15:35

si la version python est 3.X, c'est correct.

je pense que votre version python est 2.X, le super fonctionnerait en ajoutant ce code

__metaclass__ = type

donc le code est

__metaclass__ = type
class B:
    def meth(self, arg):
        print arg
class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)
print C().meth(1)
12
répondu yanghaogn 2015-08-05 01:17:47

j'ai aussi été confronté au problème posté lorsque j'ai utilisé python 2.7. Il fonctionne très bien avec python 3.4

pour le faire fonctionner en python 2.7 j'ai ajouté l'attribut __metaclass__ = type en haut de mon programme et il a fonctionné.

__metaclass__ : il facilite la transition des classes anciennes et des classes nouvelles.

2
répondu JON 2017-05-30 14:52:44