Frage

In Python 2.5 erhöht der folgende Code a 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 das ersetze class X mit class X(object), es wird klappen. Was ist die Erklärung dafür?

War es hilfreich?

Lösung

Der Grund ist, dass super() arbeitet nur auf Neustilunterricht, was in der 2.x -Serie bedeutet, sich von zu erstrecken object:

>>> class X(object):
        def a(self):
            print 'a'

>>> class Y(X):
        def a(self):
            super(Y, self).a()
            print 'b'

>>> c = Y()
>>> c.a()
a
b

Andere Tipps

Verwenden Sie außerdem nicht Super (), es sei denn, Sie müssen. Es ist nicht das allgemeine "Richtige" mit neuen Klassen im Stil, die Sie möglicherweise vermuten.

Es gibt Zeiten, in denen Sie mehrfacher Erbschaft erwarten und möglicherweise möchten, aber bis Sie die haarigen Details der MRO kennen, lassen Sie es am besten in Ruhe und bleiben Sie an:

 X.a(self)

Falls keine der oben genannten Antworten es deutlich erwähnte. Ihre übergeordnete Klasse muss von "Objekt" erben, was sie im Wesentlichen in eine neue Stilklasse verwandeln würde.

# python 3.x:
class ClassName(object): # This is a new style class
    pass

class ClassName: # This is also a new style class ( implicit inheritance from object )
    pass

# Python 2.x:
class ClassName(object): # This is a new style class
    pass

class ClassName:         # This is a old style class
    pass

Ich habe die verschiedenen XA () -Methoden ausprobiert; Sie scheinen jedoch eine Instanz von X zu erfordern, um a () auszuführen, also habe ich x () ein (Selbst), was vollständiger zu sein scheint als die vorherigen Antworten, zumindest für die von mir gestoßenen Anwendungen. Es scheint keine gute Möglichkeit zu sein, das Problem zu lösen, da es unnötige Konstruktionen und Zerstörung gibt, aber es funktioniert gut.

Meine spezifische Anwendung war das CMD.CMD -Modul von Python, das aus irgendeinem Grund offensichtlich kein Newstyle -Objekt ist.

Endergebnis:

X().a(self)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top