221

我得到一些我无法弄清楚的错误。任何线索我的示例代码有什么问题?

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)
 |
4

4 回答 4

363

您的问题是 B 类未声明为“新型”类。像这样改变它:

class B(object):

它会起作用。

super()并且所有子类/超类的东西都只适用于新式类。我建议您养成(object)在任何类定义中始终键入该内容的习惯,以确保它是一种新型类。

旧式类(也称为“经典”类)总是类型为classobj; 新式类是 type 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 中你不会有这个问题。

于 2009-11-11T04:40:10.923 回答
175

此外,如果您无法更改 B 类,您可以通过使用多重继承来修复错误。

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)
于 2013-08-23T00:02:15.600 回答
22

如果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)
于 2015-08-05T01:17:47.453 回答
5

当我使用 python 2.7 时,我也遇到了发布的问题。它在 python 3.4 上工作得很好

为了让它在 python 2.7 中工作,我__metaclass__ = type在我的程序顶部添加了该属性并且它工作。

__metaclass__:它简化了从旧式课程和新式课程的过渡。

于 2017-02-28T06:54:34.803 回答