day29 Pyhton 面向对象 继承进阶
阅读原文时间:2023年07月10日阅读:2

一.内容回顾

  初识继承

    父类\基类\超类

    子类\派生类

    派生 :派生方法.派生属性

    单继承

      继承的语法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顺序就是从子类到父类的顺序