12

或者我应该明确引用我想调用其方法的超类吗?

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

4

6 回答 6

10

《 Expert Python Programming》这本书第 3 章讨论了“超级陷阱”这个话题,值得一读。以下是本书的结论:

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

编辑:今天我又读了这本书的这一部分。我将复制更多句子,因为超级用法很棘手:

  • 避免代码中的多重继承。
  • 应与用法保持一致,不要新旧混用。
  • 在子类中调用其方法之前检查类层次结构。
于 2009-08-11T10:59:23.483 回答
6

你可以使用 super,但正如文章所说,有缺点。只要您了解它们,使用该功能就没有问题。这就像人们说“使用组合,而不是继承”或“从不使用全局变量”。如果该功能存在,那是有原因的。请务必了解原因和内容并明智地使用它们。

于 2009-08-11T10:42:28.400 回答
3

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

于 2009-08-11T10:43:21.033 回答
3

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

对于单继承,真的没有区别

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

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

所以我想这只是品味的问题。

于 2009-08-11T17:05:40.207 回答
2

人们super遇到的问题更多是多重继承的问题。所以责备有点不公平super。没有super多重继承就更糟糕了。Michele Simionato 在他关于 super的博客文章中很好地总结了这一点:

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

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

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

于 2009-08-11T12:05:56.047 回答
0

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

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

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

于 2009-08-11T10:41:19.760 回答