对于新样式的类,super()引发“ TypeError:必须是类型,而不是classobj”

以下用法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:Joachim指出,成为一个新类实例并不等同于成为一个实例object。我读了很多相反的书,因此感到困惑(基于object实例测试的新型类实例测试的示例:https : //stackoverflow.com/revisions/2655651/3)。


catspeake
浏览 313回答 3
3回答

慕斯709654

super()仅可用于新型类,这意味着根类需要从'object'类继承。例如,顶级类需要像这样:class SomeClass(object):    def __init__(self):        ....不class SomeClass():    def __init__(self):        ....因此,解决方案是直接调用父级的init方法,如下所示:class TextParser(HTMLParser):    def __init__(self):        HTMLParser.__init__(self)        self.all_data = []

郎朗坤

问题是super需要object一个祖先:>>> class oldstyle:...     def __init__(self): self.os = True>>> class myclass(oldstyle):...     def __init__(self): super(myclass, self).__init__()>>> myclass()TypeError: must be type, not classobj经过仔细检查,发现:>>> type(myclass)classobj但:>>> class newstyle(object): pass>>> type(newstyle)type    因此,解决问题的方法是从对象以及HTMLParser继承。但是确保对象在MRO类中排在最后:>>> class myclass(oldstyle, object):...     def __init__(self): super(myclass, self).__init__()>>> myclass().osTrue
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python