Следующее использование super()
вызывает TypeError: почему?
>>> from HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
... def __init__(self):
... super(TextParser, self).__init__()
... self.all_data = []
...
>>> TextParser()
(...)
TypeError: must be type, not classobj
Есть аналогичный вопрос о StackOverflow: Python super () вызывает TypeError , где ошибка объясняется тем фактом, что пользовательский класс не является классом нового стиля. Однако вышеприведенный класс является классом нового стиля, поскольку он наследуется от object
:
>>> isinstance(HTMLParser(), object)
True
Чего мне не хватает? Как я могу использовать super()
здесь?
Использование HTMLParser.__init__(self)
вместо super(TextParser, self).__init__()
будет работать, но я хотел бы понять TypeError.
PS: Йоахим отметил, что быть экземпляром класса нового стиля не эквивалентно тому, чтобы быть object
. Я много раз читал противоположное, отсюда моя путаница (пример теста экземпляра класса нового стиля на основе object
теста экземпляра: https://stackoverflow.com/revisions/2655651/3 ).
источник
super.__doc__
ничего не говорится о старом и новом стиле!super()
работает только для классов (и объектов) нового стиля, упоминается в документе HTML ( docs.python.org/library/functions.html#super ).Ответы:
Хорошо, это обычно "
super()
не может использоваться с классом старого стиля".Тем не менее, важным моментом является то, что правильный тест для "это экземпляр нового стиля (то есть объект)?" является
а не (как в вопросе)
Для классов правильный тест «это новый класс»:
Важный момент является то , что со старым стилем классов, класс экземпляра и его типа различны. Здесь
OldStyle().__class__
естьOldStyle
, что не наследуетobject
, аtype(OldStyle())
этоinstance
тип, который действительно наследует отobject
. По сути, класс старого стиля просто создает объекты типаinstance
(тогда как класс нового стиля создает объекты, тип которых сам класс). Это, вероятно , почему экземплярOldStyle()
являетсяobject
: егоtype()
наследует отobject
(того факта , что его класс никак не унаследовать отobject
не считается: классы старого стиля просто построить новые объекты типаinstance
). Частичная ссылка:https://stackoverflow.com/a/9699961/42973 .PS: разницу между классом нового стиля и классом старого стиля также можно увидеть с помощью:
(классы старого стиля не являются типами, поэтому они не могут быть типом своих экземпляров).
источник
(Oldstyle().__class__ is Oldstyle)
этоTrue
OldStyle().__class__
том, чтобы показать, как проверить, происходит ли объект (OldStyle()
) из класса старого стиля. Имея в виду только классы нового стиля, можно было бы испытать искушение сделать тестisinstance(OldStyle(), object)
вместо этого.object
, таким образом, облажаясь прокси.super () может использоваться только в классах нового стиля, что означает, что корневой класс должен наследоваться от класса 'object'.
Например, верхний класс должен быть таким:
не
Таким образом, решение заключается в том, чтобы вызвать родительский метод init напрямую, например, так:
источник
self
параметра вHTMLParser.__init__()
вызове.Вы также можете использовать
class TextParser(HTMLParser, object):
. Это делаетTextParser
на новый стиль класса, иsuper()
могут быть использованы.источник
Проблема в том, что
super
нуждаетсяobject
в качестве предка:При ближайшем рассмотрении можно найти:
Но:
Таким образом, решением вашей проблемы будет наследование от объекта, а также от HTMLParser. Но убедитесь, что объект идет последним в классах MRO:
источник
type(myclass)
важно,myclass
наследовать ли от объекта (т. Е.isinstance(myclass, object)
Является ли оно истинным - это ложное).Если вы посмотрите на дерево наследования (в версии 2.6),
HTMLParser
наследует, отSGMLParser
чего наследует, отParserBase
которого не наследуетobject
. Т.е. HTMLParser - это класс в старом стиле.Что
isinstance
касается вашей проверки , я сделал быстрый тест в ipython:Даже если класс является классом старого стиля, он все еще является экземпляром
object
.источник
isinstance(A(), object)
, а неisinstance(A, object)
нет? С последним, вы проверяете ли классA
являетсяobject
, в то время как вопрос , является ли случаи изA
являютсяobject
, не так ли?issubclass(HTMLParser, object)
, возвращает False.правильный способ сделать это будет следующим в классах старого стиля, которые не наследуются от «объекта»
источник
A
который хранит состояние.FWIW и хотя я не гуру Python, я получил с этим
Просто вернул мне результаты разбора по мере необходимости.
источник