代码如下:
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
类表示人的基本属性和行为,包括name
、age
和speak()
方法。
然后,student
类是单继承了people
类,并覆写了speak()
方法。它还定义了grade
属性。
接下来,speaker
类表示演讲家的属性和行为,包括name
、topic
和speak()
方法。
最后,sample
类多继承了speaker
和student
类。它的构造方法中,首先打印了sample.__mro__
来展示多继承的顺序。然后,通过super
方法调用继承的方法,父类的构造方法__init__
方法会按照MRO的顺序依次被调用,保证了所有基类的初始化都被执行。在speak()
方法中,通过super
方法可以实现方法的链式调用,即先调用sample
类的父类speaker
的speak()
方法,再调用student
类的speak()
方法,最后再调用speaker
类的speak()
方法。
在运行时,先实例化一个sample
对象test
,传入相关参数。然后调用test.speak()
方法,输出了一系列的结果。
通过多继承,sample
类同时继承了speaker
和student
类的属性和方法,实现了代码的复用和功能的扩展。通过super
方法,我们可以在子类中调用父类的方法,实现了方法的链式调用。在这段代码中,多继承和super方法的作用在于继承和调用相关方法,实现了代码的灵活性和可复用性。