超级()失败,错误:TypeError“参数1必须是types,而不是classobj”
我得到了一些我无法弄清楚的错误。 任何线索我的示例代码有什么问题?
class B: def meth(self, arg): print arg class C(B): def meth(self, arg): super(C, self).meth(arg) print C().meth(1)
我从“超级”内置方法的帮助下获得了示例testing代码。 类“C”是
这是错误:
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()
和所有的子类/超类的东西只适用于新风格的类。 我build议你养成在任何类定义中总是input这个(object)
的习惯,以确保它是一个新式的类。
旧式类(也称为“经典”类)始终是classobj
types; 新的类是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中,所有的类都是新的types。 您仍然可以使用旧式类的语法,但是会得到一个新式的类。 所以,在Python 3.x中,你不会有这个问题。
另外,如果您不能更改类B,则可以使用多重inheritance来修复错误。
class B: def meth(self, arg): print arg class C(B, object): def meth(self, arg): super(C, self).meth(arg) print C().meth(1)
如果python版本是3.X,没关系。
我认为你的Python版本是2.X,超级会在添加这个代码时工作
__metaclass__ = type
所以代码是
__metaclass__ = type class B: def meth(self, arg): print arg class C(B): def meth(self, arg): super(C, self).meth(arg) print C().meth(1)
当我使用Python 2.7时,我也遇到了这个问题。 它在Python 3.4中工作得很好
为了使它在python 2.7中工作,我在程序的顶部添加了__metaclass__ = type
属性,它工作。
__metaclass__
:它简化了从旧式类和新式类的转换。