343 Stimmen

super() löst "TypeError: must be type, not classobj" für new-style class aus

Die folgende Verwendung von super() löst einen TypeError aus: warum?

>>> from  HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
...     def __init__(self):
...         super(TextParser, self).__init__()
...         self.all_data = []
...         
>>> TextParser()
(...)
TypeError: must be type, not classobj

Es gibt eine ähnliche Frage auf StackOverflow: Python super() löst TypeError aus Der Fehler ist darauf zurückzuführen, dass es sich bei der Benutzerklasse nicht um eine Klasse des neuen Stils handelt. Die obige Klasse ist jedoch eine Klasse des neuen Stils, da sie von object :

>>> isinstance(HTMLParser(), object)
True

Was übersehe ich? Wie kann ich die super() hier?

Verwendung von HTMLParser.__init__(self) 代わりに super(TextParser, self).__init__() funktionieren würde, aber ich würde gerne den TypeError verstehen.

PS: Joachim wies darauf hin, dass eine Instanz der neuen Stilklasse nicht gleichbedeutend ist mit einer object . Ich habe viele Male das Gegenteil gelesen, daher meine Verwirrung (Beispiel für einen Klasseninstanztest neuen Stils auf der Grundlage von object Instanztest: https://stackoverflow.com/revisions/2655651/3 ).

5voto

Jacob Abraham Punkte 905

Die korrekte Vorgehensweise ist in den Klassen des alten Stils, die nicht von 'object' erben, wie folgt zu gestalten

class A:
    def foo(self):
        return "Hi there"

class B(A):
    def foo(self, name):
        return A.foo(self) + name

0voto

qwerty_so Punkte 33121

FWIW und obwohl ich kein Python-Guru bin, kam ich mit diesem

>>> class TextParser(HTMLParser):
...    def handle_starttag(self, tag, attrs):
...        if tag == "b":
...            self.all_data.append("bold")
...        else:
...            self.all_data.append("other")
...     
...         
>>> p = TextParser()
>>> p.all_data = []
>>> p.feed(text)
>>> print p.all_data
(...)

Ich habe gerade die Parse-Ergebnisse zurückbekommen, wie benötigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X