108

在 Python 2.5 中,以下代码引发了 a 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 Xclass X(object)它将起作用。对此有何解释?

4

4 回答 4

133

原因是super()只对新式类进行操作,这在 2.x 系列中意味着从 扩展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
于 2009-01-28T20:48:26.683 回答
13

此外,除非必须,否则不要使用 super()。对于您可能怀疑的新型类,这不是通用的“正确的事情”。

有时您期望多重继承并且您可能想要它,但是在您了解 MRO 的毛茸茸的细节之前,最好不要管它并坚持:

 X.a(self)
于 2009-02-01T03:23:05.507 回答
3

如果以上答案都没有明确提及。您的父类需要从“对象”继承,这实际上会将其变成一个新的样式类。

# 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
于 2017-03-14T22:48:58.360 回答
1

我尝试了各种 Xa() 方法;但是,它们似乎需要 X 的实例才能执行 a(),所以我做了 X().a(self),这似乎比以前的答案更完整,至少对于我遇到的应用程序而言。由于存在不必要的构造和破坏,这似乎不是处理问题的好方法,但它工作正常。

我的特定应用程序是 Python 的 cmd.Cmd 模块,由于某种原因,它显然不是 NewStyle 对象。

最后结果:

X().a(self)
于 2012-04-02T10:18:40.420 回答