先来了解下多重继承的概念,所谓多重继承,是指python的类可以有两个以上父类,也即有类A,类B,类C,C同时继承类A与类B,此时C中可以使用A与B中的属性与方法。那么问题来了,如果A与B中具有相同名字的方法,这个时候python怎么调用的会是哪个方法呢?
python中使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承,也叫菱形继承问题)等
MRO即method resolution order,用于判断子类调用的属性来自于哪个父类。在Python2.3之前,MRO是基于深度优先算法的,自2.3开始使用C3算法,定义类时需要继承object,这样的类称为新式类,否则为旧式类
代码
- #类定义
- 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):
- student.__init__(self,n,a,w,g)
- speaker.__init__(self,n,t)
- test = sample("小黑",25,80,4,"Python")
- test.speak()#方法名同,默认调用的是在括号中排前地父类的方法
运行结果
我叫小黑,我是一个演说家,我演讲的主题是 Python