Ich erhalte einen Fehler, den ich nicht herausfinden kann. Gibt es einen Hinweis darauf, was mit meinem Beispielcode nicht stimmt?
class B:
def meth(self, arg):
print arg
class C(B):
def meth(self, arg):
super(C, self).meth(arg)
print C().meth(1)
Ich habe den Beispieltestcode mithilfe der integrierten 'Super'-Methode erhalten.
Hier ist der Fehler:
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
Zu Ihrer Information, hier ist die Hilfe (super) von Python selbst:
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)
|
Antworten:
Ihr Problem ist, dass Klasse B nicht als "New-Style" -Klasse deklariert ist. Ändere es so:
und es wird funktionieren.
super()
und alle Sachen der Unterklasse / Oberklasse funktionieren nur mit Klassen neuen Stils. Ich empfehle Ihnen, sich daran zu gewöhnen, dies immer(object)
in eine Klassendefinition einzugeben, um sicherzustellen, dass es sich um eine Klasse neuen Stils handelt.Klassen alten Stils (auch als "klassische" Klassen bekannt) sind immer vom Typ
classobj
; Klassen neuen Stils sind vom Typtype
. Aus diesem Grund haben Sie die folgende Fehlermeldung erhalten:TypeError: super() argument 1 must be type, not classobj
Versuchen Sie dies, um sich selbst davon zu überzeugen:
Beachten Sie, dass in Python 3.x alle Klassen im neuen Stil sind. Sie können weiterhin die Syntax der Klassen im alten Stil verwenden, erhalten jedoch eine Klasse im neuen Stil. In Python 3.x tritt dieses Problem also nicht auf.
quelle
super()
. Klasse A muss dazu gebracht werden, mit einer "alten" Klasse zu arbeiten, und möglicherweise ist der beste Weg, dies zu tun, Klasse A selbst zu einer "alten" Klasse zu machen. Natürlich empfehle ich, nur Ihr gesamtes Programm für die Ausführung in Python 3.x zu aktualisieren, damit alle Klassen unabhängig von Ihrer Tätigkeit einen neuen Stil erhalten. Wenn diese Option verfügbar ist, ist sie die beste Option.class B(object):
. Ich erhalte diesen Fehler aufgrund der Verwendung@mock.patch('module.B', autospec=B)
kurz vor meinem Testfall. Irgendwelche Gedanken darüber, wie man das behebt?Wenn Sie Klasse B nicht ändern können, können Sie den Fehler mithilfe der Mehrfachvererbung beheben.
quelle
type
), während dennoch eine Klasse im "alten Stil" (deren Klassenobjekt vom Typ istclassobj
) untergeordnet wird .super()
funktioniert mit Klassen neuen Stils, jedoch nicht mit Klassen alten Stils.Wenn die Python-Version 3.X ist, ist es in Ordnung.
Ich denke, Ihre Python-Version ist 2.X, das Super würde funktionieren, wenn Sie diesen Code hinzufügen
so ist der Code
quelle
Ich war auch mit dem veröffentlichten Problem konfrontiert, als ich Python 2.7 verwendete. Es funktioniert sehr gut mit Python 3.4
Damit es in Python 2.7 funktioniert, habe ich das
__metaclass__ = type
Attribut oben in meinem Programm hinzugefügt und es hat funktioniert.__metaclass__
: Es erleichtert den Übergang von Klassen alten und neuen Klassen.quelle