day29 Pyhton 面向对象 继承进阶
一.内容回顾
初识继承
父类\基类\超类
子类\派生类
派生 :派生方法.派生属性
单继承
继承的语法class子类名(父类名)
解决开发中代码冗余的问题
子类继承了父类之后,可以调用父类中的方法
如果子类的对象调用某个方法:对象/自己类/父类
如果子类的对象调用的某个方法父子类中都有:
正常情况下是用自己的
想用父类的:
super().方法名()
父类名.方法名(self)
继承表达的是两个类之间 父类子类的关系
二.今日内容
抽象类:规则
约束了所有继承这个抽象类的子类必须实现某些同名方法
# from abc import ABCMeta,abstractmethod # class Abstract(metaclass=ABCMeta): # metaclass 元类 # @abstractmethod # def func_name(self): # print('继承Abstract的子类中必须有一个func_name的方法') # class Son(Abstract): # def func_name(self): # print('继承了Abstract就必须写一个func_name方法')
接口类(对多个抽象类的多继承)
# class Abstract1(metaclass=ABCMeta): # metaclass 元类 # @abstractmethod # def wahaha(self): # print('继承Abstract1的子类中必须有一个wahaha的方法') # class Abstract2(metaclass=ABCMeta): # metaclass 元类 # @abstractmethod # def qqxing(self): # print('继承Abstract2的子类中必须有一个qqxing的方法') # class Son(Abstract1,Abstract2): # def wahaha(self): # print('继承Abstract1的子类中必须有一个wahaha的方法') # def qqxing(self): # print('继承Abstract2的子类中必须有一个qqxing的方法')
# 归一化设计 # class Student: # def login(self):pass # class Teacher: # def login(self):pass # def login(obj): # obj.login() # a = Student() # a.login() # b = Teacher() # b.login()
# c3算法 # 求某一类在多继承中的继承顺序: # 类的mro== [类] + [父类的继承顺序] + [父类2的继承顺序].... # 如果从左到右的第一个类在后面的顺序中都没出现,那么就提出来到mro顺序中 # [ABCD] + [EO] --> A = [BCD] + [EO] # 如果从左到右的第一个类在后面的顺序中出现,且在后面的顺序中也是第一位,那么就提出来到mro顺序中 # [ABCD] + [AEO] --> A = [BCD] + [EO] # 如果从左到右的第一个类在后面的顺序中出现,但不是在第一位,那么应该继续往后找,找到符合规则的项目 # [ABCD] + [EAO] --> E = [ABCD] + [AO] # [ABCD] + [EAO] + [GEO] --> G = [ABCD] + [EAO] + [EO] # [ABCD] + [EAO] + [EO] --> GE = [ABCD] + [AO] + [O] # 关键结论: # 这个类没有发生继承,他的顺序永远是[类O] # 只要是单继承,不是多继承,那么mro顺序就是从子类到父类的顺序