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.
中将 Carnivour
与 Mammal
交换时它如何改变输出
谁能详细解释一下它是如何读取输出打印的代码的
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线性化算法的细节,但基本思想是:总是先跟随最左边的子类,除非做所以会发生一些荒谬的事情,其中“一些荒谬的事情”实际上意味着“在线性化中超类出现在它的子类之前”。
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.
Carnivour
与 Mammal
交换时它如何改变输出
谁能详细解释一下它是如何读取输出打印的代码的
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线性化算法的细节,但基本思想是:总是先跟随最左边的子类,除非做所以会发生一些荒谬的事情,其中“一些荒谬的事情”实际上意味着“在线性化中超类出现在它的子类之前”。