python(继承顺序)
1.python可以继承多个类。
2.python如果继承多个类,其寻找方法有两种:深度优先和广度优先。
例:F继承D和F,D继承B,F继承C,B和C继承A。
https://www.cnblogs.com/linhaifeng/articles/7340153.html#_label2
查找的顺序是F,D,B,E,C,A
# -*- coding: utf-8 -*- class A: def test(self): print('A') class B(A): def test(self): print('B') class C(A): def test(self): print('C') class D(B): def test(self): print('D') class E(C): def test(self): print('E') class F(D,E): def test(self): print('F') f1=F() f1.test()
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
基类没有继承的就是经典类,基类有继承的就是新式类。
子类中调用父类的方法
方法一:指名道姓,即父类名.父类方法()
# -*- coding: utf-8 -*- class Vehicle: #定义交通工具类 Country='China' def __init__(self,name,speed,load,power): self.name=name self.speed=speed self.load=load self.power=power def run(self): print('开动啦...') class Subway(Vehicle): #地铁 def __init__(self,name,speed,load,power,line): Vehicle.__init__(self,name,speed,load,power) #子类在父类的基础上加东西 self.line=line def run(self): print('地铁%s号线欢迎您' %self.line) Vehicle.run(self) line13=Subway('中国地铁','180m/s','1000人/箱','电',13) line13.run()
(推荐)方法二:super()<------不用写父类的名字了
1 # -*- coding: utf-8 -*- 2 class Vehicle: # 定义交通工具类 3 Country = 'China' 4 5 def __init__(self, name, speed, load, power): 6 self.name = name 7 self.speed = speed 8 self.load = load 9 self.power = power 10 11 def run(self): 12 print('开动啦...') 13 14 15 class Subway(Vehicle): # 地铁 16 def __init__(self, name, speed, load, power, line): 17 # super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self) 18 super().__init__(name, speed, load, power) 19 self.line = line 20 21 def run(self): 22 print('地铁%s号线欢迎您' % self.line) 23 super(Subway, self).run() 24 25 26 class Mobike(Vehicle): # 摩拜单车 27 pass 28 29 30 line13 = Subway('中国地铁', '180m/s', '1000人/箱', '电', 13) 31 line13.run()