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

发布于 2021-01-29 15:00:10

以下用法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)。

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    好吧,这是通常的“super()不能与老式类一起使用”。

    但是,重要的一点是对“这是一个新的 实例* (即对象)吗?” 的正确测试 。是 *

    >>> class OldStyle: pass
    >>> instance = OldStyle()
    >>> issubclass(instance.__class__, object)
    False
    

    而不是(如问题所示):

    >>> isinstance(instance, object)
    True
    

    对于 ,正确的“这是新型类”测试是:

    >>> issubclass(OldStyle, object)  # OldStyle is not a new-style class
    False
    >>> issubclass(int, object)  # int is a new-style class
    True
    

    关键的一点 是,与老式类的 的实例和它的 类型 是不同的。在这里,OldStyle().__class__is
    OldStyle,它不继承自object,而type(OldStyle())isinstance类型,它 确实
    继承自object。基本上,旧式类仅创建类型的对象instance(而新式类将创建其类型为类本身的对象)。这大概就是为什么实例OldStyle()object:其type()从继承object(事实上,它的类并
    没有
    继承object不计数:老式类只是构建类型的新对象instance)。部分参考:https://stackoverflow.com/a/9699961/42973

    PS:新式类和旧式类之间的区别还可以通过以下方式看到:

    >>> type(OldStyle)  # OldStyle creates objects but is not itself a type
    classobj
    >>> isinstance(OldStyle, type)
    False
    >>> type(int)  # A new-style class is a type
    type
    

    (旧式类 不是 类型,因此它们不能是其实例的类型)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看