繁体   English   中英

在Python中使用super()是个好主意吗?

[英]Is it a good idea to use super() in Python?

或者我应该只显式引用我想调用其方法的超类?

在引用它们的构造函数时重复超类的名称似乎很脆弱,但是这个页面http://fuhm.net/super-harmful/对使用super()做了一些很好的论据。

专家Python编程一书在第3章讨论了“超级陷阱”的主题。值得一读。 以下是本书的结论:

超级用法必须保持一致:在类层次结构中,super应该在任何地方或任何地方使用。 混合超级和经典电话是一种令人困惑的做法。 人们倾向于避免超级,因为他们的代码更加明确。

编辑:今天我再次阅读本书的这一部分。 我会复制一些句子,因为超级使用很棘手:

  • 避免在代码中进行多重继承。
  • 与其使用保持一致,不要混合使用新风格和旧风格。
  • 在子类中调用其方法之前检查类层次结构。

你可以使用超级,但正如文章所说,有缺点。 只要您了解它们,使用该功能就没有问题。 就像人们说“使用组合,而不是继承”或“从不使用全局变量”。 如果该功能存在,则有一个原因。 请务必明白为什么以及明智地使用它们。

我更喜欢super(),因为它允许您更改继承的类(例如,当您重构并添加中间类时)而不更改所有方法。

人们对super的问题更多是多重继承的问题。 所以责备super有点不公平。 没有super多重继承甚至更糟。 Michele Simionato在他关于super的博客文章中很好地把它包装起来:

另一方面,人们可能想知道所有超级疣是否都没有暗示某些严重问题。 很可能问题不在于super,也不在于合作方法:问题可能在于多重继承本身。

所以主要的教训是你应该尽量避免多重继承。

为了保持一致性,我总是使用super,即使单个继承它并不重要(除了不必知道父类名称的小优点)。 在Python 3+中super更方便,所以一定要使用super。

super()试图解决多重继承的问题; 它很难复制它的语义,你肯定不应该创建任何新的语义,除非你完全确定。

对于单继承,两者之间确实没有区别

class X(Y):
    def func(self):
        Y.func(self)

class X(Y):
    def func(self):
        super().func()

所以我猜这只是味道的问题。

是的,你应该使用super()不是其他方法。 这是Python 3中的标准对象继承模型。

只需坚持__init__方法中的关键字参数,就不会有太多问题。 此外,您可以使用**kwargs来支持未在继承链的级别中定义的其他参数。

我同意它很脆弱,但同样使用继承类的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM