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顺序就是从子类到父类的顺序
原文地址:https://www.cnblogs.com/pythonz/p/10007447.html