如何解决Python的super函数
| 在下面的示例中,B.Go()
方法的最后两行都从class A
调用call1ѭ方法。它们在功能上是否相同?使用ѭ3only唯一的好处是我不必知道继承的类名吗?
class A(object):
def Go(self):
print \"Calling A.Go()\"
class B(A):
def Go(self):
super(B,self).Go()
A.Go(self)
inst = B()
inst.Go()
解决方法
不,
super()
不能直接调用A.Go
。 super(B,self).Go()
按方法解析顺序调用下一个方法。它调用了如果没有实现B
便会调用的方法。在直接线性继承中,该值始终为A
,因此没有真正的区别(除了您重复的类之外)。但是,在多重继承的情况下,按常规方法解析顺序的下一个类不一定是当前方法的直接基类。类。请参见Guido对这些功能的原始说明中有关钻石继承的说明。
, 除了托马斯·沃特斯(Thomas Wouters)提供的出色答案外,我还要补充说super()
还是非常有用的,因为它是计算间接的。使用super()
的一个主要好处是您不必通过名称指定委托类,这使以后更改基类变得容易。 Raymond Hettinger对此发表了一篇很棒的文章:Python的super()被认为是super!
, 不完全是。通过使用super,您只需要实例化B,就有一个实例。第二行创建一个新的A实例,可能在初始化程序中产生副作用,并且不共享其他实例属性或状态(B实例inst
)。
, 他们是完全不同的。调用A()。Go()构造一个全新的对象,该对象与创建该对象的实例不共享任何属性。
您的示例太简单了,您需要有一个状态来显示实际的不同行为
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。