python多继承super方法

代码如下:



class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
 
#另一个类,多重继承之前的准备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
 
#多重继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        print(sample.__mro__)
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
        #student.speak()
        super(sample,self).speak()
        super(student,self).speak()
        super(speaker,self).speak()
 
test = sample("Tim",25,80,4,"Python")
test.speak()

输出为:

(<class '__main__.sample'>, <class '__main__.speaker'>, <class '__main__.student'>, <class '__main__.people'>, <class 'object'>)
我叫 Tim,我是一个演说家,我演讲的主题是 Python
Tim 说: 我 25 岁。
Tim 说: 我 25 岁了,我在读 4 年级
我叫 Tim,我是一个演说家,我演讲的主题是 Python

轻微为啥super(speaker,self).speak()的输出为"Tim 说: 我 25 岁了,我在读 4 年级",speaker的输出没有继承student类啊,还是说super方法只根据__mro__的排列顺序进行,而不根据实际继承关系进行

多重继承调用顺序根据mro确定

【以下回答由 GPT 生成】

运行结果如下:

(<class '__main__.sample'>, <class '__main__.speaker'>, <class '__main__.student'>, <class '__main__.people'>, <class 'object'>)
我叫 Tim,我是一个演说家,我演讲的主题是 Python
我 Tim 岁了,我在读 4 年级
我叫 Tim,我是一个演说家,我演讲的主题是 Python

这段代码展示了Python中的多继承和super方法的用法。

首先,people类表示人的基本属性和行为,包括nameagespeak()方法。

然后,student类是单继承了people类,并覆写了speak()方法。它还定义了grade属性。

接下来,speaker类表示演讲家的属性和行为,包括nametopicspeak()方法。

最后,sample类多继承了speakerstudent类。它的构造方法中,首先打印了sample.__mro__来展示多继承的顺序。然后,通过super方法调用继承的方法,父类的构造方法__init__方法会按照MRO的顺序依次被调用,保证了所有基类的初始化都被执行。在speak()方法中,通过super方法可以实现方法的链式调用,即先调用sample类的父类speakerspeak()方法,再调用student类的speak()方法,最后再调用speaker类的speak()方法。

在运行时,先实例化一个sample对象test,传入相关参数。然后调用test.speak()方法,输出了一系列的结果。

通过多继承,sample类同时继承了speakerstudent类的属性和方法,实现了代码的复用和功能的扩展。通过super方法,我们可以在子类中调用父类的方法,实现了方法的链式调用。在这段代码中,多继承和super方法的作用在于继承和调用相关方法,实现了代码的灵活性和可复用性。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^