或者我应该明确引用我想调用其方法的超类吗?
在引用它们的构造函数时重复超类的名称似乎很脆弱,但是这个页面http://fuhm.net/super-harmful/提出了一些反对使用 super() 的好论据。
或者我应该明确引用我想调用其方法的超类吗?
在引用它们的构造函数时重复超类的名称似乎很脆弱,但是这个页面http://fuhm.net/super-harmful/提出了一些反对使用 super() 的好论据。
《 Expert Python Programming》这本书第 3 章讨论了“超级陷阱”这个话题,值得一读。以下是本书的结论:
super 的使用必须一致:在类层次结构中,super 应该在任何地方使用或不在任何地方使用。混合超级呼叫和经典呼叫是一种令人困惑的做法。人们倾向于避免使用 super,因为他们的代码更加明确。
编辑:今天我又读了这本书的这一部分。我将复制更多句子,因为超级用法很棘手:
你可以使用 super,但正如文章所说,有缺点。只要您了解它们,使用该功能就没有问题。这就像人们说“使用组合,而不是继承”或“从不使用全局变量”。如果该功能存在,那是有原因的。请务必了解原因和内容并明智地使用它们。
我更喜欢 super() ,因为它允许您更改继承的类(例如,当您重构并添加中间类时)而不更改所有方法。
super() 试图为你解决多重继承的问题;很难复制它的语义,除非你完全确定,否则你当然不应该创建任何新的语义。
对于单继承,真的没有区别
class X(Y):
def func(self):
Y.func(self)
和
class X(Y):
def func(self):
super().func()
所以我想这只是品味的问题。
人们super
遇到的问题更多是多重继承的问题。所以责备有点不公平super
。没有super
多重继承就更糟糕了。Michele Simionato 在他关于 super的博客文章中很好地总结了这一点:
另一方面,人们可能想知道是否所有的超级疣都暗示了一些潜在的严重问题。很可能问题不在于 super,也不在于协作方法:问题可能在于多重继承本身。
所以主要的教训是你应该尽量避免多重继承。
为了保持一致性,我总是使用 super,即使对于单继承来说它并不重要(除了不必知道父类名称的小优势)。在 Python 3+super
中更方便,所以绝对应该使用 super。
是的,您应该使用super()
其他方法。这是现在 Python 3 中的标准对象继承模型。
只需在__init__
方法中使用关键字参数,就不会遇到太多问题。此外,您可以使用**kwargs
来支持未在继承链级别中定义的其他参数。
我同意它很脆弱,但不亚于使用继承类的名称。