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

15 投票
6 回答
6264 浏览
提问于 2025-04-15 13:31

我是不是应该直接提到我想调用的父类的方法呢?

每次提到父类的构造函数时都重复父类的名字感觉有点脆弱,但这篇文章 http://fuhm.net/super-harmful/ 对使用super()提出了一些不错的反对意见。

6 个回答

5

super() 是用来帮助你解决多重继承问题的;这个问题比较复杂,想要自己去实现它的规则是很难的,除非你非常确定自己在做什么,否则最好不要去创造新的规则。

对于单一继承来说,

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

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

其实没有什么区别,所以这只是个人喜好的问题。

6

你可以使用super这个功能,但正如文章所说,它也有一些缺点。只要你了解这些缺点,使用这个功能就没问题。这就像有人说“用组合,不要用继承”或者“永远不要使用全局变量”。如果这个功能存在,就一定有它的理由。只要你明白为什么要这样做,以及它的具体作用,就可以聪明地使用它。

12

这本书《专家级Python编程》在第三章讨论了“super陷阱”这个话题,非常值得一读。下面是书中的总结:

使用super要保持一致:在一个类的层次结构中,要么到处使用super,要么根本不使用。混合使用super和经典调用会让人感到困惑。很多人倾向于避免使用super,以便让他们的代码更清晰。

补充:今天我又读了这部分内容,决定再复制一些句子,因为使用super确实有点棘手:

  • 尽量避免在代码中使用多重继承。
  • 使用时要保持一致,不要混合新式和旧式的用法。
  • 在子类中调用方法之前,先检查一下类的层次结构。

撰写回答