在Python 2.5中,以下代码引发了TypeError
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
如果我将class X
替换为class X(object)
,它将会有效。对此有何解释?
答案 0 :(得分:128)
原因是super()
仅在new-style classes上运行,而2.x系列中的{{3}}意味着从object
延伸:
>>> class X(object):
def a(self):
print 'a'
>>> class Y(X):
def a(self):
super(Y, self).a()
print 'b'
>>> c = Y()
>>> c.a()
a
b
答案 1 :(得分:14)
此外,除非必须,否则不要使用super()。对于您可能怀疑的新式课程,这不是通用的“正确的事情”。
有些时候你期待多重继承并且你可能想要它,但是在你知道MRO的毛茸茸的细节之前,最好不要管它并坚持:
X.a(self)
答案 2 :(得分:3)
如果上述答案都没有明确提及。您的父类需要从&#34; object&#34;继承,这实质上将其转换为新的样式类。
# python 3.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is also a new style class ( implicit inheritance from object )
pass
# Python 2.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is a old style class
pass
答案 3 :(得分:1)
我尝试了各种X.a()方法;然而,他们似乎需要一个X的实例来执行a(),所以我做了X()。a(self),这看起来比之前的答案更完整,至少对于我遇到过的应用程序。它似乎不是处理问题的好方法,因为有不必要的构造和破坏,但它工作正常。
我的具体应用是Python的cmd.Cmd模块,由于某种原因显然不是NewStyle对象。
最终结果:
X().a(self)