17

考虑:

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 而不是让它工作的确切复杂性是什么。

4

2 回答 2

25

super找出方法解析顺序中的下一个类。你传入的两个参数是让它弄清楚的原因——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 中的下一个类可能不是当前班级的基础之一)。

于 2013-04-09T08:09:09.577 回答
0

如果我没记错的话,您不必从 python3 开始将子实例作为参数传递。另外,要深入了解 super() 方法,请参阅https://rhettinger.wordpress.com/2011/05/26/super-considered-super/

于 2018-08-08T14:42:03.960 回答