Python super()引发了TypeError

时间:2009-01-28 20:47:10

标签: python inheritance python-2.x super

在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),它将会有效。对此有何解释?

4 个答案:

答案 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)