超级()失败,错误: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)的习惯,以确保它是一个新式的类。

旧式类(也称为“经典”类)始终是classobjtypes; 新的类是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__ :它简化了从旧式类和新式类的转换。