在Python中使用super()是个好主意吗?
或者我应该直接引用我想调用其方法的超类吗在Python中使用super()是个好主意吗?,python,oop,super,Python,Oop,Super,或者我应该直接引用我想调用其方法的超类吗 在引用超类的构造函数时,重复超类的名称似乎很脆弱,但本页提供了一些反对使用super()的有力论据。是的,您应该使用super(),而不是使用其他方法。这现在是Python 3中的标准对象继承模型 只要坚持使用\uuu init\uu方法中的关键字参数,就不会有太多问题。此外,您还可以使用**kwargs来支持继承链级别中未定义的其他参数 我同意它是脆弱的,但不亚于使用继承类的名称。您可以使用super,但正如文章所说,它也有缺点。只要您了解它们,使用该
在引用超类的构造函数时,重复超类的名称似乎很脆弱,但本页提供了一些反对使用super()的有力论据。是的,您应该使用
super()
,而不是使用其他方法。这现在是Python 3中的标准对象继承模型
只要坚持使用\uuu init\uu
方法中的关键字参数,就不会有太多问题。此外,您还可以使用**kwargs
来支持继承链级别中未定义的其他参数
我同意它是脆弱的,但不亚于使用继承类的名称。您可以使用super,但正如文章所说,它也有缺点。只要您了解它们,使用该功能就没有问题。这就像人们说的“使用组合,而不是继承”或“永远不要使用全局变量”。如果该功能存在,则是有原因的。请务必理解为什么和什么,并明智地使用它们。我更喜欢super(),因为它允许您更改继承的类(例如,当您重构和添加中间类时),而不必在所有方法上更改它。这本书在第3章中讨论了“超级陷阱”的主题。它值得一读。以下是本书的结论: Super的用法必须是一致的:在类层次结构中,Super应该在任何地方或任何地方使用。混合超级和经典通话是一种令人困惑的做法。人们倾向于避免使用super,因为他们的代码更加明确 编辑:今天我又读了这一部分。我将复制更多的句子,因为超级用法很棘手:
- 避免代码中的多重继承
- 与它的用法保持一致,不要将新款和新款混用 老式的
- 在中调用其方法之前,请检查类层次结构 你的子类
- 人们对
super
的问题更多的是多重继承的问题。因此,责怪super
有点不公平。没有super
多重继承更糟糕。米歇尔·西米奥纳托(Michele Simionato)在他的《超级英雄》(on super)中很好地总结了这一点:
另一方面,人们可能想知道
并非所有的超级疣都暗示着某些
潜在的严重问题。可能
好吧,问题不在于你
超级,也不使用合作方法:
问题可能出在多个方面
继承本身
因此,主要的教训是,您应该尽量避免多重继承
出于一致性的考虑,我总是使用super,即使对于单个继承来说这并不重要(除了不必知道父类名称的小优势)。在Python 3+super
更方便,所以一定要使用super。super()试图为您解决多重继承的问题;很难复制它的语义,除非您完全确定,否则您当然不应该创建任何新的语义
对于单一继承,两者之间实际上没有区别
class X(Y):
def func(self):
Y.func(self)
及
因此,我想这只是品味的问题。除非您还没有使用python 3(这是python使用的大多数),否则您的意思是什么?super()也在Python2上。我相信它已经被后端口了。“如果这个特性存在,那是有原因的。”这个论点完全是不正确的。许多语言都有不应该被任何人使用的特性。你写得很好。但是你会考虑让你的回答更冗长吗?代码>是针对哪个问题?问题标题
在Python中使用super()是个好主意吗?
还是问题的第一行,还是我应该直接引用我要调用其方法的超类?
。在多次阅读您的答案后,我认为您建议显式引用超类,而不是使用super。但在我看来,如果不反复阅读,很难理解你的答案。@Md.AbuNafeeIbnaZahid补充了一些额外的措辞。我希望这会有帮助。谢谢。现在好多了。
class X(Y):
def func(self):
super().func()