我得到一些我无法弄清楚的错误。任何线索我的示例代码有什么问题?
class B: def meth(self, arg): print arg class C(B): def meth(self, arg): super(C, self).meth(arg) print C().meth(1)
我从“超级”内置方法的帮助中获得了示例测试代码。
这是错误:
Traceback (most recent call last): File "./test.py", line 10, in ? print C().meth(1) File "./test.py", line 8, in meth super(C, self).meth(arg) TypeError: super() argument 1 must be type, not classobj
仅供参考,这是 python 本身的帮助(超级):
Help on class super in module __builtin__: class super(object) | super(type) -> unbound super object | super(type, obj) -> bound super object; requires isinstance(obj, type) | super(type, type2) -> bound super object; requires issubclass(type2, type) | Typical use to call a cooperative superclass method: | class C(B): | def meth(self, arg): | super(C, self).meth(arg) |
您的问题是 B 类未声明为“新型”类。像这样改变它:
class B(object):
它会起作用。
super()并且所有子类/超类的东西都只适用于新式类。我建议您养成(object)在任何类定义中始终键入该内容的习惯,以确保它是一种新型类。
super()
(object)
旧式类(也称为“经典”类)总是类型为classobj; 新式类是 type type。这就是您收到错误消息的原因:
classobj
type
TypeError: super() argument 1 must be type, not classobj
试试这个,看看自己:
class OldStyle: pass class NewStyle(object): pass print type(OldStyle) # prints: <type 'classobj'> print type(NewStyle) # prints <type 'type'>
请注意,在 Python 3.x 中,所有类都是新样式的。您仍然可以使用旧式类的语法,但您会得到一个新式类。所以,在 Python 3.x 中你不会有这个问题。