以下使用super()会引发 TypeError:为什么?
super()
>>> 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() raises TypeError,错误是由用户类不是新式类的事实来解释的。但是,上面的类是一个新式类,因为它继承自object:
object
>>> isinstance(HTMLParser(), object) True
我错过了什么?我如何使用super(), 在这里?
使用HTMLParser.__init__(self)代替super(TextParser, self).__init__()会起作用,但我想了解 TypeError。
HTMLParser.__init__(self)
super(TextParser, self).__init__()
好吧,这是通常的“super()不能与旧式类一起使用”。
然而,重要的一点是“这是一个新型 实例* (即对象)吗?” 的正确测试。 是 *
>>> class OldStyle: pass >>> instance = OldStyle() >>> issubclass(instance.__class__, object) False
而不是(如问题):
>>> isinstance(instance, object) True
对于 classes ,正确的“这是一个新式类”测试是:
>>> 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())是instance类型,它 继承 自object。基本上,旧式类只创建类型instance的对象(而新式类创建类型为类本身的对象)。这可能就是为什么实例OldStyle()是object: 它的type()继承自object(它的类不继承自的事实 不算 :object旧式类仅构造 类型的新对象instance)。
OldStyle().__class__
OldStyle
type(OldStyle())
instance
OldStyle()
type()
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
(旧式类 不是 类型,因此它们不能是其实例的类型)。