Python super()继承和所需参数

Python super()继承和所需参数,python,inheritance,Python,Inheritance,考虑到: class Parent(object): def altered(self): print "PARENT altered()" class Child(Parent): def altered(self): print "CHILD, BEFORE PARENT altered()" super(Child, self).altered() # what are the arguments needed?

考虑到:

class Parent(object):

    def altered(self):
        print "PARENT altered()"

class Child(Parent):

    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()    # what are the arguments needed?  Why Child and self?
        print "CHILD, AFTER PARENT altered()"

在Python 2.7中,为什么必须将
Child
作为参数传递给
super()
调用?使用super而不是让它工作的确切复杂性是什么。

super
找出方法解析顺序中的下一个类。您传入的两个参数使它能够理解out-
self
通过一个属性为它提供了整个MRO;当前类告诉它您现在在MRO上的位置。所以super实际上做的基本上是:

def super(cls, inst):
    mro = inst.__class__.mro() # Always the most derived class
    return mro[mro.index(cls) + 1]

它之所以是当前类而不是基类,是因为拥有super的整个意义在于拥有一个函数来计算基类是什么,而不是必须显式地引用它——如果基类的名称更改,如果您不知道父类的确切调用方式,这可能会导致问题(想想工厂函数,比如
namedtuple
,它会生成一个新类),尤其是在多重继承情况下(在这种情况下,MRO中的下一个类可能不是当前类的基础之一).

如果我没有弄错的话,您不必将子实例作为python3以后的参数传递。另外,要深入理解super()方法,请参考

据我所知,它与MRO有关。但我不太擅长用“真实”来解释它回答。也许这有帮助:请注意,在Python3中不再需要参数了。所以第一个参数是“Child”是针对您所在的类,而不是您希望从中继承的类,因为父类是基类?我想是这样的。还要感谢您的阅读,我正在使用Python 2.7来澄清这一点。我将继续阅读有关super()的内容它是当前类而不是基类的原因是,拥有super的全部意义在于拥有一个函数来计算基类是什么,而不是显式地引用它。我认为您所说的那一行很好地总结了它。我将研究MRO,并意识到这只是Python2.x的一个方面,因为ython 3不需要这些参数。谢谢。@klandshome Python 3的super工作原理完全相同-它只是有一些有趣的增强功能,能够在大多数情况下为自己找出参数(通过检查调用堆栈)而不是你必须把它们传进来。嗯。很好的信息。调用堆栈。我学到了很多。谢谢。这是一个非同寻常的解释!