python - typeerror super argument 1 must be type not classobj




super()引发新类风格的“TypeError:必须是类型,而不是classobj” (4)

super()只能用于新样式类,这意味着根类需要从“对象”类继承。

例如,顶级类需要如下所示:

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()会引发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 : https://stackoverflow.com/revisions/2655651/3 )。


你也可以使用class TextParser(HTMLParser, object): 这使得TextParser成为一种新风格的类,并且可以使用super()


如果您查看继承树(版本2.6), HTMLParser继承自继承自object继承的ParserBase SGMLParser 。 即HTMLParser是一种旧式的类。

关于您使用isinstance ,我在ipython中做了一个快速测试:

In [1]: class A:
   ...:     pass
   ...: 

In [2]: isinstance(A, object)
Out[2]: True

即使一个类是旧式类,它仍然是object的一个实例。


正确的做法将如下面的老式类不继承'对象'

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

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




typeerror