Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用super()是个好主意吗?_Python_Oop_Super - Fatal编程技术网

在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()