考虑到:
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()
调用的参数传递?使用超级而不仅仅是让它起作用的确切错综复杂是什么。
答案 0 :(得分:22)
super
确定哪个是方法解决顺序中的下一个类。你传入的两个参数是什么让它能够解决这个问题 - self
通过属性为它提供整个MRO;当前的类告诉它你现在在MRO 的哪个地方。所以超级实际上做的基本上是:
def super(cls, inst):
mro = inst.__class__.mro() # Always the most derived class
return mro[mro.index(cls) + 1]
它是当前类而不是基类的原因是因为拥有super的整个要点是拥有一个函数来解决该基类的问题而不必明确地引用它 - 这可能会导致问题,如果如果您不确切地知道调用父类的内容(考虑像namedtuple
那样吐出一个新类的工厂函数),特别是在多继承情况下(下一个),基类的名称会发生变化MRO中的类可能不是当前类的基础之一。
答案 1 :(得分:0)
如果我没记错的话,您不必从python3开始将子实例作为参数传递。另外,要深入了解super()方法,请参考https://rhettinger.wordpress.com/2011/05/26/super-considered-super/