Python super()引发TypeError

在Python 2.5.2中,下面的代码引发了一个TypeError:

>>> class X: ... def a(self): ... print "a" ... >>> class Y(X): ... def a(self): ... super(Y,self).a() ... print "b" ... >>> c = Y() >>> ca() 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(object)replaceclass X ,它将工作。 这是什么解释?

原因是super()只对新的类有效,在2.x系列中意味着从对象扩展。

另外,除非必须,否则不要使用super()。 对于您可能会怀疑的新式课程,这并不是通用的“正确的事情”。

有些时候你期望多重inheritance,而且你可能会需要它,但是直到你知道MRO的毛发细节之前,最好让它独立并坚持:

  Xa(self) 

如果没有上述答案清楚地提到。 你的父类需要从“对象”inheritance,这本质上将它变成一个新的风格类。

 # 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 

我尝试了各种Xa()方法; 然而,他们似乎需要一个X的实例来执行一个(),所以我做了X()。一个(自我),这似乎比以前的答案更完整,至less对于我遇到的应用程序。 由于没有必要的build设和破坏,似乎并不是处理这个问题的好方法,但它工作的很好。

我的具体应用是Python的cmd.Cmd模块,由于某种原因,这显然不是NewStyle对象。

最后结果:

 X().a(self)