继承 子类继承父类所有属性 如果属性名重名了,则先从子类开始找,不会覆盖父类的属性
1 class Dad: 2 money = 10 3 4 def __init__(self, name): 5 print('开始') 6 self.name = name 7 8 def hit_son(self): 9 print('%s 正在打儿子' % self.name) 10 11 12 class Son(Dad): 13 money = 1100000000 # 与父类重名了,不会覆盖父类的属性 14 pass 15 16 17 s1 = Son('haha') 18 print(s1.money) 19 print(Dad.money) 20 输出: 21 开始 22 1100000000 23 10
如果A类继承B类,那么当A类进行实例化的时候,首先在A类中寻找init的方法,如果没有,就从B类中寻找。
传递的参数就按照找到的那个init方法进行传参。调用函数属性的时候也是先从本类中寻找,如果本类中有,就执行本类的函数,如果没有就从父类中寻找后执行
1 class Dad: 2 money = 10 3 4 def __init__(self, name): 5 print('开始') 6 self.name = name 7 8 def hit_son(self): 9 print('%s 正在打儿子' % self.name) 10 11 12 class Son(Dad): 13 money = 1100000000 # 与父类重名了,不会覆盖父类的属性 14 def hit_son(self): 15 print('这是子类') 16 17 18 s1 = Son('haha') 19 print(s1.money) 20 print(Dad.money) 21 s1.hit_son() 22 输出: 23 开始 24 1100000000 25 10 26 这是子类
什么时候用继承:1.类之间有显著的不同,并且较小的类是较大的类所需要的组件时,用组合
2.当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承
接口类 必须实现父类的方法,否则无法创建子类
1 import abc 2 3 4 class AllBasic(metaclass=abc.ABCMeta): 5 @abc.abstractmethod 6 def read(self): 7 pass 8 9 @abc.abstractmethod 10 def write(self): 11 pass 12 13 14 class Mem(AllBasic): 15 def read(self): 16 print('写方法') 17 18 def write(self): 19 print('写方法') 20 21 22 s1 = Mem()
继承顺序 python3中是使用广度优先。