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)
|
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.
à 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.
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)
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)
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.