使用super
. 据我所知,这就是它的目的......
首先,一些建议阅读:
接下来,一个例子:
class A(object):
def __init__(self, x):
print "Called A"
self.a=x
class B(A):
def __init__(self, x):
print "Called B"
super(B,self).__init__(x)
self.b=x
class C(A):
def __init__(self, x):
print "Called C"
super(C,self).__init__(x)
self.c=x
class D(B,C):
def __init__(self, x):
print "Called D"
super(D,self).__init__(x)
self.d=x
foo = D(10)
如评论中所述,您经常看到使用 super 定义的方法来接受任意数量的位置和关键字参数:
def mymethod(self,*args,**kwargs):
super(thisclass,self).method(*args,**kwargs)
...
因为这允许super
将必要/不必要的参数传递给继承链中的其他对象。然后这些方法可以决定他们需要哪些参数并忽略其余的(当然将它们传递给下一个super
)
最后,为了完成这个讨论,我们需要讨论 python2.x 与 python3.x。在 python2.x 中,你所有的类都必须是新样式(它们最终需要继承object
)。在 python3.x 中,这是自动的。在 python3.x 中,您可以省略super
.
super().__init__(*args,**kwargs)
但是,我更喜欢 python2.x 样式,因为它适用于 python2.x 和 python3.x,我总是想知道super()
(python3.x 样式)如何知道将什么对象传递给底层方法作为self
. 对我来说,这似乎比 python2.x 版本更神奇......