问题:super()失败,并显示错误:当父级未从对象继承时,TypeError“参数1必须为类型,而不是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)
我从“ super”内置方法的帮助下获得了示例测试代码。
这是错误:
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)
|
回答 0
您的问题是类B没有声明为“新式”类。像这样更改它:
class B(object):
它会工作。
super()
并且所有子类/超类的内容仅适用于新型类。我建议您养成始终(object)
在任何类定义上键入它的习惯,以确保它是一种新型的类。
旧式类(也称为“经典”类)始终为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中,您将不会遇到此问题。
回答 1
另外,如果您不能更改类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)
回答 2
如果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)
回答 3
当我使用python 2.7时,也会遇到发布的问题。它在python 3.4下工作得很好
为了使其在python 2.7中工作,我__metaclass__ = type
在程序顶部添加了该属性,并且该属性可以正常工作。
__metaclass__
:简化了从旧样式类到新样式类的过渡。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。