多重继承顺序:带你吃透python的多重继承顺序 - 知乎
python使用C3 linearization算法搜索,有时候又需要调用位置靠后父类的函数,下面我们来看一个实例。
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 岁了,体重 %d kg" % (self.name,self.age,self.__weight))
def get_weight(self):
return self.__weight
#单继承示例
class student(people): #子类student继承父类people
grade=''
def __init__(self,n,a,w,g):
super(student,self).__init__(n,a,w)#调用父类构造函数
#或者people.__init__(self,n,a,w) 使用这个可能会出现父类__init__多次调用的情况
#或者super().__init__(n,a,w)
# 也可以super().__init__(self,n,a,w)
self.grade=g
def speak(self): #子类重写父类方法
print("%s 说:我今年 %d 岁,读 %d 年级,体重 %d kg" % (self.name, self.age,self.grade, self.get_weight()))
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):
student.__init__( self,n, a, w, g)
super(sample,self).__init__( n, t)
test = sample("Tim",25,80,4,"Python")
print(sample.__mro__) #查看方法的搜索顺序
test.speak() #方法名同,一般调用的是在括号中参数位置排前父类的方法(sample(speaker,student))
#我叫 Tim,我是一个演说家,我演讲的主题是 Python
super(student,test).speak()#调用student父类方法
#Tim 说:我今年 25 岁了,体重 80 kg
t2=student(test.name,test.age,test.get_weight(),test.grade)
t2.speak() #Tim 说:我今年 25 岁,读 4 年级,体重 80 kg
print(list(test.__dict__.values())[0:4]) #['Tim', 25, 80, 4]
#__dict__属性获取sample类对象test的属性字典
#提取字典的值,转为列表形式,截取前四个参数
t3=student(*list(test.__dict__.values())[0:4])
t3.speak() #Tim 说:我今年 25 岁,读 4 年级,体重 80 kg