Python 为什么super()的隐式本质是一个可取的特性?

Python 为什么super()的隐式本质是一个可取的特性?,python,class,multiple-inheritance,super,Python,Class,Multiple Inheritance,Super,这有点像是一个附加问题。问题基本上是“为什么我应该使用super()”,答案是“因为您不必引用父类,这很好。” 我的问题是…为什么这是件好事?“显式优于隐式”到底发生了什么?假设我正在阅读其他开发人员的代码,我看到: class Foo(Bar, Baz): def my_method(self): super(Foo, self).who_knows( ) #nobody knows! 现在,我必须在Bar和Baz上的文档以及它们的所有父类中进行挖掘,以找出从何处调用

这有点像是一个附加问题。问题基本上是“为什么我应该使用
super()
”,答案是“因为您不必引用父类,这很好。”

我的问题是…为什么这是件好事?“显式优于隐式”到底发生了什么?假设我正在阅读其他开发人员的代码,我看到:

class Foo(Bar, Baz):
    def my_method(self):
        super(Foo, self).who_knows( ) #nobody knows!

现在,我必须在
Bar
Baz
上的文档以及它们的所有父类中进行挖掘,以找出从何处调用
who_knows()
,以及它的作用。我还需要完全理解方法解析顺序,以便知道实际调用的是哪个
who_knows()

现在让我们看一下没有
super()
的相同代码:

更清楚,不需要猜测或理解MRO


我提出这个问题不是为了开始争论或哲学讨论。我只是希望有人能给我看一些非常清楚的例子,在这些例子中,
super()
的隐式本质实际上是可取的,因为老实说,我没有看到它。

特别是在这种情况下,
super(Foo,self)。谁知道()
根本不是一件好事。我只会做self.who_knows()


super()
通常用于从父类重写具有相同名称的方法。

当您将实现委托给代码的其他部分时,对代码的编写方式“显式”将无法达到此目的。确切地知道所调用的内容等同于依赖于该实现,因此如果一段代码发生更改,另一段代码也必须更改


考虑到旧的
Baz.who_knows(self)
方法仍然存在歧义问题。如果
Baz
没有覆盖
谁知道
,那么您仍然不知道
Baz
的哪个超类定义了实际实现。那么您是否将
Foo
的代码中的那一行更改为指向实际实现它的类?但是,如果您决定在
Baz
中覆盖它,您需要再次更新
Foo
(以及所有其他子类)。

因为协作基类可以让您的生活更轻松。@MartijnPieters而牺牲其他人阅读您的代码?@galarant有些人甚至根本不理解多态性。我们是否也应该停止使用这种机制?“我现在必须深入研究Bar和Baz上的文档以及它们的所有父类,直到找到从何处调用who_know(),以及它的作用。”-实际上,在协作多重继承中,您不能这样做。你不知道哪种方法是MRO中的下一种方法。我相信这个想法是,你们应该设计方法,这样它们的调用顺序才重要,因为它们是由一个有效的拓扑类型的继承图引起的。我不知道这在真实的程序中会是什么样子;我尽量避免复杂的继承。
class Foo(Bar, Baz):
    def my_method(self):
        Baz.who_knows(self) #ah, Baz knows