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