Python super() soulève TypeError
Dans Python 2.5, le code suivant soulève un TypeError
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
Si je remplace le class X
avec class X(object)
, il va fonctionner. Quelle est l'explication pour cela?
- votre "cependant j'ai remplacer la classe X avec la classe X(objet)" résolu mon problème ! merci
Vous devez vous connecter pour publier un commentaire.
La raison en est que
super()
fonctionne uniquement sur new-classes de style, qui, dans le 2.la série x de moyens s'étendant à partir deobject
:En outre, ne pas utiliser de super (), sauf si vous avez. Ce n'est pas l'usage général "bonne chose" à voir avec la nouvelle-classes de style que vous pourriez soupçonner.
Il ya des moments où vous vous attendez à de l'héritage multiple et vous pourriez peut-être voulez, mais jusqu'à ce que vous connaissez le poilu détails de la MRO, mieux le laisser seul, et s'en tenir à:
__init__
) pour passer à travers les arguments dans un endroit propre et bon sens, sinon vous obtiendrez TypeErrors ou aggraver des problèmes de débogage lorsque quelqu'un essaie de se multiplier, héritent à l'aide de votre classe. Sauf si vous avez vraiment conçu pour un soutien MI de cette façon (ce qui est assez délicat), il est probablement préférable d'éviter l'implicationsuper
a que la méthode est MI-fort.Dans le cas où aucune des réponses ci-dessus mentionné clairement. Votre parent de la classe doit hériter de la "objet", qui aurait essentiellement pour effet de le transformer en une nouvelle classe de style.
J'ai essayé les différents X.() méthodes; cependant, ils semblent exiger une occurrence de X dans le but d'effectuer une(), donc je n'ai X().a(auto), ce qui semble plus complète que les précédentes réponses, au moins pour les applications que j'ai rencontré. Il ne semble pas être une bonne façon de gérer le problème, car il est inutile de construction et de destruction, mais il fonctionne très bien.
Mon application a été Python cmd.Cmd module, ce qui n'est évidemment pas un NewStyle objet pour une raison quelconque.
Résultat Final: