In Python 2.5 löst der folgende Code ein 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
Wenn ich die ersetzen class X
mit class X(object)
, wird es funktionieren. Was ist die Erklärung dafür?
Antworten:
Der Grund dafür ist, dass
super()
nur Klassen neuen Stils verwendet werden , was in der 2.x-Serie bedeutet, dass Folgendes erweitert wirdobject
:quelle
Verwenden Sie außerdem nicht super (), es sei denn, Sie müssen. Es ist nicht das allgemeine "Richtige", mit Klassen neuen Stils zu tun, die Sie vielleicht vermuten.
Es gibt Zeiten, in denen Sie eine Mehrfachvererbung erwarten und möglicherweise möchten, aber bis Sie die haarigen Details des MRO kennen, lassen Sie es am besten in Ruhe und bleiben Sie bei:
quelle
__init__
), um Argumente auf saubere und vernünftige Weise zu durchlaufen. Andernfalls treten TypeErrors oder schlechtere Debugging-Probleme auf, wenn jemand versucht, mit Ihrer Klasse zu vererben. Wenn Sie nicht wirklich darauf ausgelegt sind, MI auf diese Weise zu unterstützen (was ziemlich schwierig ist), ist es wahrscheinlich besser zu vermeiden,super
dass die Methode MI-sicher ist.Falls keine der oben genannten Antworten dies klar erwähnte. Ihre übergeordnete Klasse muss von "Objekt" erben, wodurch es im Wesentlichen zu einer neuen Stilklasse wird.
quelle
Ich habe die verschiedenen Xa () -Methoden ausprobiert. Sie scheinen jedoch eine Instanz von X zu benötigen, um a () auszuführen, also habe ich X (). a (self) ausgeführt, was zumindest für die Anwendungen, auf die ich gestoßen bin, vollständiger zu sein scheint als die vorherigen Antworten. Es scheint keine gute Möglichkeit zu sein, das Problem zu lösen, da unnötige Konstruktionen und Zerstörungen erforderlich sind, aber es funktioniert einwandfrei.
Meine spezielle Anwendung war das cmd.Cmd-Modul von Python, das aus irgendeinem Grund offensichtlich kein NewStyle-Objekt ist.
Endergebnis:
quelle