Dans Python 2.5, le code suivant déclenche 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
par class X(object)
, cela fonctionnera. Quelle est l'explication à cela?
Réponses:
La raison en est que
super()
ne fonctionne que sur les classes de nouveau style , ce qui dans la série 2.x signifie s'étendre deobject
:la source
De plus, n'utilisez pas super () sauf si vous devez le faire. Ce n'est pas la "bonne chose" générale à faire avec les classes de style nouveau que vous pourriez soupçonner.
Il y a des moments où vous vous attendez à un héritage multiple et vous pourriez le vouloir, mais jusqu'à ce que vous connaissiez les détails poilus du MRO, mieux vaut le laisser tranquille et s'en tenir à:
la source
__init__
) pour passer les arguments de manière propre et sensée, sinon vous aurez des erreurs de type ou des problèmes de débogage pires lorsque quelqu'un essaie d'hériter de manière multiple en utilisant votre classe. À moins que vous n'ayez vraiment conçu pour prendre en charge MI de cette manière (ce qui est assez délicat), il est probablement préférable d'éviter l'implicationsuper
que la méthode est sûre MI.Au cas où aucune des réponses ci-dessus ne le mentionnerait clairement. Votre classe parent doit hériter de "object", ce qui le transformerait essentiellement en une nouvelle classe de style.
la source
J'ai essayé les différentes méthodes Xa (); cependant, ils semblent nécessiter une instance de X pour exécuter a (), donc j'ai fait X (). a (self), qui semble plus complet que les réponses précédentes, du moins pour les applications que j'ai rencontrées. Cela ne semble pas être un bon moyen de gérer le problème car il y a une construction et une destruction inutiles, mais cela fonctionne bien.
Mon application spécifique était le module cmd.Cmd de Python, qui n'est évidemment pas un objet NewStyle pour une raison quelconque.
Résultat final:
la source