Python super()引发类型错误

Python super()引发类型错误,python,inheritance,python-2.x,super,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 la

在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
>>X类:
def a(自我):
打印“a”
>>>Y类(X类):
def a(自我):
超级(Y,self).a()
打印“b”
>>>c=Y()
>>>c.a()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第3行,在
TypeError:super()参数1必须是类型,而不是classobj
如果我将
类X
替换为
类X(对象)
,它将工作。对此的解释是什么?

原因是只在上运行,在2.x系列中,这意味着从
对象扩展而来:

>>> 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

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

有时,您可能希望获得多重继承,但在您了解MRO的详细信息之前,最好别管它,坚持:

 X.a(self)
我尝试了各种X.a()方法;但是,它们似乎需要一个X实例来执行a(),因此我使用了X().a(self),这似乎比前面的答案更完整,至少对于我遇到的应用程序来说是如此。这似乎不是一个处理问题的好方法,因为有不必要的建设和破坏,但它工作得很好

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

最终结果:

X().a(self)

如果上面的答案都没有明确提到。您的父类需要从“object”继承,这将从本质上将其转换为一个新样式的类

# 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

这是从哪个python版本变成默认行为的?2.2是在引入新样式类时,3.0是它们成为默认行为的地方。@tsunami如果你想获得超类,请执行“X.a(self)”我想你误解了我。三联画。我记得当时我使用的是一个低于3.0的python版本,我并没有特别提到我的类继承自Object,对super的调用也很有效。也许这是2.6版的默认行为?只是说:)雪花石膏,真的没有必要。新样式的类有很多好处,不仅仅是超级的。旧式的方法不应该被推广。这是正确的吗?因为在我学习Python/Django的6个月里,我一直使用super作为“一般正确的事情”?它本身不会对单一继承造成伤害(只是它有点慢),但它本身也不会给你带来任何好处。您必须设计任何需要乘法继承的方法(最明显的是
\uuuu init\uuuu
)以干净合理的方式传递参数,否则当有人试图使用您的类进行乘法继承时,您将遇到类型错误或更糟糕的调试问题。除非你真的以这种方式设计支持MI(这相当棘手),否则最好避免
super
暗示该方法是MI-safe的。这似乎是个错误的建议。你的“然而我用类X(对象)替换类X”修复了我的问题!这能回答你的问题吗?很抱歉,但是在Python3.x中,您的第二个示例(隐式继承)在提到的问题的上下文中实际上不起作用。