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) 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