Python 如何读取代码?在这种情况下以什么顺序

How does the Python read the code? in what order in this case

 class Animal:
    def set_health(self, health):
        print("Set in Animal")

class Carnivour(Animal):
    def set_health(self, health):
        super().set_health(health)
        print("Set in Canivour")

class Mammal(Animal):
    def set_health(self,health):
        super().set_health(health)
        print("Set in Mammal")

class Dog(Carnivour, Mammal):
    def set_health(self, health):
        super().set_health(health)

    print("Set in dog")


dog = Dog()
dog.set_health(10)

我知道Python是从左到右阅读这个代码结构的。但是我不明白当我们在 Dog() class.

中将 CarnivourMammal 交换时它如何改变输出

谁能详细解释一下它是如何读取输出打印的代码的

Set in animal
Set in Mammal
Set in Carnivour
Set in dog

当我们在 Dog() class

中第一个 Carnivour

感谢您的帮助和理解

您正在寻找 method resolution order 或 MRO(链接文章适用于 Python 2.3,但与大多数以 Python-2 为中心的文章不同,这篇文章实际上在今天仍然相关) .当你有多重继承时,Python 线性化继承层次结构以确定 super 应该去哪里。在您的情况下,在您发布的代码中,MRO 是

Dog < Carnivour < Mammal < Animal

如果你交换 Dog 中的继承顺序,你会得到

Dog < Mammal < Carnivour < Animal

由于您在 打印之前进行了“递归”super 调用 ,因此 print 语句以与继承层次结构相反的顺序出现。

你可以在上面link的Python中阅读所有关于用于MRO的C3线性化算法的细节,但基本思想是:总是先跟随最左边的子类,除非做所以会发生一些荒谬的事情,其中​​“一些荒谬的事情”实际上意味着“在线性化中超类出现在它的子类之前”。