python-多继承
目录
python的新式类和经典类
class A: # 经典类 pass class B(object): # 新式类 pass
- python2中默认都是经典类,只有显示继承了object才是新式类
- python3中默认都是新式类,不必显示写出继承object
简单的多继承
class Teacher(): def knowledge(self): print("我可以教人读书") class parents(): def property(self): print("我有很大的家业") class Student(Teacher, parents): def play(self): print("我是一个学生,我会玩") s = Student() s.play() # 学生类自己的玩方法 s.knowledge() # 老师类的知识方法 s.property() # 父母类的家业方法
- 有相同的方法名时,多继承的查找顺序
- 从左到右查找(继承的父类都只有一层的时候)
class Teacher(): def knowledge(self): print("我可以教人读书") def eat(self): print("老师吃饭的模样") class parents(): def property(self): print("我有很大的家业") def eat(self): print("父母吃饭的模样") class Student(Teacher, parents): def play(self): print("我是一个学生,我会玩") s = Student() s.eat() 控制台输出: 老师吃饭的模样
- 有相同的方法名时,多继承的查找顺序(不止有一层,父类上面还有父类,父类上面还有父类的情况)
class Principal(): def eat(self): print("我是一个校长,我是校长的吃饭模样") class Teacher(Principal): def knowledge(self): print("我可以教人读书") # def eat(self): # print("老师吃饭的模样") class grandpa(): def eat(self): print("我是爷爷,我是爷爷吃饭的模样") class parents(): def property(self): print("我有很大的家业") def eat(self): print("父母吃饭的模样") class Student(Teacher, parents): def play(self): print("我是一个学生,我会玩") # 此时学生类继承了,老师类和父母类, # 老师类无吃饭方法,父母类有吃饭方法,老师类的父类-校长类有吃饭的方法,父母类的父类-爷爷类有吃饭的方法 s = Student() s.eat() 控制台输出: 我是一个校长,我是校长的吃饭模样
哇,这样看并不是按照广度优先来查找的呢,其实是按照c3算法来进行查找的,这里c3算法没必要了解,想要了解继承的顺序使用mro方法就可以看到
print(s.mro()) 控制台: [<class ‘__main__.Student‘>, <class ‘__main__.Teacher‘>, <class ‘__main__.Principal‘>, <class ‘__main__.parents‘>, <class ‘__main__.Grandpa‘>, <class ‘object‘>]