super() 将如何影响 MRO 中的顺序?
How would the super() affect the order in MRO?
JetBrains 学院的所有示例代码。
如果我执行这样的代码,
#Code sample 1
class Robot:
def greet(self):
print("I am a robot")
class Android(Robot):
def greet(self):
super().greet()
print("I am an android")
class PersonalAssistant(Robot):
def greet(self):
super().greet()
print("I am a personal assistant")
class AssistantAndroid(Android, PersonalAssistant):
def greet(self):
super().greet()
输出为
I am a robot
I am a personal assistant
I am an android
None
为什么私人助理被打印在之前android?
AssistantAndroid 的 MRO 是 (<class '__main__.AssistantAndroid'>, <class '__main__.Android'>, <class '__main__.PersonalAssistant'>, <class '__main__.Robot'>, <class 'object'>)
所以首先我们去 Android 并首先在 Android 中找到 super 这让我们去机器人然后为什么代码去 PersonalAssistant 而不是执行下一个打印(我是 android)在 Android?
此外,谁能教我None是从哪里来的?
如果super像这样在子类中移动到print()的下一行
#Code sample 2
class Person:
def print_message(self):
print("Message from Person")
class Student(Person):
def print_message(self):
print("Message from Student")
super().print_message()
class Programmer(Person):
def print_message(self):
print("Message from Programmer")
super().print_message()
class StudentProgrammer(Student, Programmer):
def print_message(self):
super().print_message()
输出的顺序与 MRO 一样正确。
jack = StudentProgrammer()
jack.print_message()
# Message from Student
# Message from Programmer
# Message from Person
但为什么#Code sample 1 的执行命令如此奇怪?
------------
我在这里添加了一些额外的印刷品,但事情对我来说更奇怪..
class Robot:
def greet(self):
print("Start robot")
print("I am a robot")
print("Finish robot")
class Android(Robot):
def greet(self):
print("Start Android")
super().greet()
print("I am an android")
print("Finish Android")
class PersonalAssistant(Robot):
def greet(self):
print("Start PersonalAssistant")
super().greet()
print("I am a personal assistant")
print("Finish PersonalAssistant")
class AssistantAndroid(Android, PersonalAssistant):
def greet(self):
print("Start AssistantAndroid")
super().greet()
print("Finish AssistantAndroid")
a = AssistantAndroid()
print('AssistantAndroid', AssistantAndroid.__mro__)
print('Android', Android.__mro__)
print('PersonalAssistant', PersonalAssistant.__mro__)
print("--------------------")
print(a.greet())
输出为
Start AssistantAndroid
Start Android
Start PersonalAssistant
Start robot
I am a robot
Finish robot
I am a personal assistant
Finish PersonalAssistant
I am an android
Finish Android
Finish AssistantAndroid
None
这是否意味着,当执行到 级别 2 类(Android 和 PersonalAssistant) 时,它只执行 在 Android 和 中一行,然后在 PersonalAssistant 中一行,然后当它在 super() 中执行时=48=]Android??意思是执行机器人,然后完成机器人后,它进入PersonalAssistant的第二行,也就是机器人,然后它跳过了它??,那为什么完成PersonalAssistant然后完成Android ...我我完全糊涂了..
非常感谢@Blckknght 的回答
请参考他的回答我觉得解释的很好。
基本上,当Multiple inheritance来的时候,你应该遵循的唯一关系就是MRO order。 (MRO 的逆向) 所以这就是为什么 Start Android
跟随 Start PersonalAssistant
而不是 Start robot
因为从 MRO 的逆向,PersonalAssistant 变成了 father 共 Android。因此 Android 中的 super() 将调用 PersonalAssistant 而不是机器人。
理解有误请指正
当所有 greet
方法在打印它们自己的文本之前调用 super().greet
时,输出将以 MRO 的相反方向出现(不包括 object
,因为它不有一个 greet
方法)。
想想调用堆栈,其中每个方法在继续 print
之前等待对 return 的 super().greet
调用。这是它的样子,缩进表示堆栈的深度:
# in AssistantAndroid.greet()...
super().greet() # resolves to Android.greet() when self is an AssistantAndroid
# in Android.greet()...
super().greet() # resolves to PersonalAssitant.greet() when self is an AssistantAndroid
# in PersonalAssistant.greet()...
super().greet() # resolves to Robot.greet() when self is an AssistantAndroid
# in Robot.greet(), where there's no super() call
print("I am a robot")
# continuing PersonalAssistant.greet()
print("I am a personal assistant")
# continuing Android.greet()
print("I am an android")
# continuing AssistantAndroid.greet(), but there's nothing left to do
JetBrains 学院的所有示例代码。
如果我执行这样的代码,
#Code sample 1
class Robot:
def greet(self):
print("I am a robot")
class Android(Robot):
def greet(self):
super().greet()
print("I am an android")
class PersonalAssistant(Robot):
def greet(self):
super().greet()
print("I am a personal assistant")
class AssistantAndroid(Android, PersonalAssistant):
def greet(self):
super().greet()
输出为
I am a robot
I am a personal assistant
I am an android
None
为什么私人助理被打印在之前android?
AssistantAndroid 的 MRO 是 (<class '__main__.AssistantAndroid'>, <class '__main__.Android'>, <class '__main__.PersonalAssistant'>, <class '__main__.Robot'>, <class 'object'>)
所以首先我们去 Android 并首先在 Android 中找到 super 这让我们去机器人然后为什么代码去 PersonalAssistant 而不是执行下一个打印(我是 android)在 Android?
此外,谁能教我None是从哪里来的?
如果super像这样在子类中移动到print()的下一行
#Code sample 2
class Person:
def print_message(self):
print("Message from Person")
class Student(Person):
def print_message(self):
print("Message from Student")
super().print_message()
class Programmer(Person):
def print_message(self):
print("Message from Programmer")
super().print_message()
class StudentProgrammer(Student, Programmer):
def print_message(self):
super().print_message()
输出的顺序与 MRO 一样正确。
jack = StudentProgrammer()
jack.print_message()
# Message from Student
# Message from Programmer
# Message from Person
但为什么#Code sample 1 的执行命令如此奇怪?
------------
我在这里添加了一些额外的印刷品,但事情对我来说更奇怪..
class Robot:
def greet(self):
print("Start robot")
print("I am a robot")
print("Finish robot")
class Android(Robot):
def greet(self):
print("Start Android")
super().greet()
print("I am an android")
print("Finish Android")
class PersonalAssistant(Robot):
def greet(self):
print("Start PersonalAssistant")
super().greet()
print("I am a personal assistant")
print("Finish PersonalAssistant")
class AssistantAndroid(Android, PersonalAssistant):
def greet(self):
print("Start AssistantAndroid")
super().greet()
print("Finish AssistantAndroid")
a = AssistantAndroid()
print('AssistantAndroid', AssistantAndroid.__mro__)
print('Android', Android.__mro__)
print('PersonalAssistant', PersonalAssistant.__mro__)
print("--------------------")
print(a.greet())
输出为
Start AssistantAndroid
Start Android
Start PersonalAssistant
Start robot
I am a robot
Finish robot
I am a personal assistant
Finish PersonalAssistant
I am an android
Finish Android
Finish AssistantAndroid
None
这是否意味着,当执行到 级别 2 类(Android 和 PersonalAssistant) 时,它只执行 在 Android 和 中一行,然后在 PersonalAssistant 中一行,然后当它在 super() 中执行时=48=]Android??意思是执行机器人,然后完成机器人后,它进入PersonalAssistant的第二行,也就是机器人,然后它跳过了它??,那为什么完成PersonalAssistant然后完成Android ...我我完全糊涂了..
非常感谢@Blckknght 的回答
请参考他的回答我觉得解释的很好。
基本上,当Multiple inheritance来的时候,你应该遵循的唯一关系就是MRO order。 (MRO 的逆向) 所以这就是为什么 Start Android
跟随 Start PersonalAssistant
而不是 Start robot
因为从 MRO 的逆向,PersonalAssistant 变成了 father 共 Android。因此 Android 中的 super() 将调用 PersonalAssistant 而不是机器人。
理解有误请指正
当所有 greet
方法在打印它们自己的文本之前调用 super().greet
时,输出将以 MRO 的相反方向出现(不包括 object
,因为它不有一个 greet
方法)。
想想调用堆栈,其中每个方法在继续 print
之前等待对 return 的 super().greet
调用。这是它的样子,缩进表示堆栈的深度:
# in AssistantAndroid.greet()...
super().greet() # resolves to Android.greet() when self is an AssistantAndroid
# in Android.greet()...
super().greet() # resolves to PersonalAssitant.greet() when self is an AssistantAndroid
# in PersonalAssistant.greet()...
super().greet() # resolves to Robot.greet() when self is an AssistantAndroid
# in Robot.greet(), where there's no super() call
print("I am a robot")
# continuing PersonalAssistant.greet()
print("I am a personal assistant")
# continuing Android.greet()
print("I am an android")
# continuing AssistantAndroid.greet(), but there's nothing left to do