super()失败,并显示错误:当父级未从对象继承时,TypeError

我收到一些我不知道的错误。任何线索我的示例代码有什么问题吗?


class B:

    def meth(self, arg):

        print arg


class C(B):

    def meth(self, arg):

        super(C, self).meth(arg)


print C().meth(1)

我从“ super”内置方法的帮助下获得了示例测试代码。“ 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)

 |


杨魅力
浏览 621回答 3
3回答

慕莱坞森

您的问题是类B没有声明为“新样式”类。像这样更改它:class B(object):它会工作。super()并且所有子类/超类的内容仅适用于新型类。我建议您养成始终(object)在任何类定义上键入它的习惯,以确保它是一种新型的类。旧式类(也称为“经典”类)始终为type classobj;新样式类的类型为type。这就是为什么您看到错误消息的原因:TypeError: super() argument 1 must be type, not classobj试试看自己:class OldStyle:&nbsp; &nbsp; passclass NewStyle(object):&nbsp; &nbsp; passprint type(OldStyle)&nbsp; # prints: <type 'classobj'>print type(NewStyle) # prints <type 'type'>请注意,在Python 3.x中,所有类都是新样式。您仍然可以使用旧样式类中的语法,但是会获得新样式类。因此,在Python 3.x中,您将不会遇到此问题。

12345678_0001

另外,如果您不能更改类B,则可以使用多重继承来修复错误。class B:&nbsp; &nbsp; def meth(self, arg):&nbsp; &nbsp; &nbsp; &nbsp; print argclass C(B, object):&nbsp; &nbsp; def meth(self, arg):&nbsp; &nbsp; &nbsp; &nbsp; super(C, self).meth(arg)print C().meth(1)

子衿沉夜

如果python版本是3.X,就可以了。我认为您的python版本是2.X,添加此代码后,超级版本将起作用__metaclass__ = type所以代码是__metaclass__ = typeclass B:&nbsp; &nbsp; def meth(self, arg):&nbsp; &nbsp; &nbsp; &nbsp; print argclass C(B):&nbsp; &nbsp; def meth(self, arg):&nbsp; &nbsp; &nbsp; &nbsp; super(C, self).meth(arg)print C().meth(1)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python