美文网首页
day26面向对象\继承\Mixins机制

day26面向对象\继承\Mixins机制

作者: 荭鲤鱼与緑鲤鱼与驴 | 来源:发表于2020-08-08 17:55 被阅读0次

    抽象
    要找出类与类之间的继承关系,需要先抽象,再继承
    抽象即总结相似之处,总结对象之间的相似之处得到的类就是父类
    类与类之间的继承指的是'什么'是'什么'(博大精深,自己体会这两个什么)
    比如:人类分支:男人,女人;男人又分支小明,小红,中国男人,外国男人,非洲男人等;那么人类就是男人的父类,而男人又是中国男人,外国男人,非洲男人的父类
    再比如动物类:人类,狗,猪,猴等等;那么动物类是人类,猪,够分类的父类等等
    继承
    继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为父类\基类\超类
    class OldboyPeople:
    school = 'oldboy'
    class Student(OldboyPeople):
    def init(self,name,age,gender,stud_id):
    self.name = name
    self.age = age
    self.gender = gender
    self.id = stud_id
    class Teacher(OldboyPeople):
    def init(self,name,age,gender,salary):
    self.name = name
    self.age = age
    self.gender = gender
    self.salaru = salary
    obj1 = Student('shuai',18,'male',4657) # 学生信息
    obj2 = Teacher('eogn',18,'female',40000) # 老师信息

    可以看到学生类和老师的类都继承了学校的类,因为老师和学生都是一个学校的

    print(obj2.school) # 老师对象里面继承了学校类里面学校属性
    print(obj1.school) # 学生对象里面继承了学校类里面学校属性

    但是这样明显是不够的,因为name,age,gender这两个信息在学生和老师都存在,这就出现了重复代码问题

    为何要有继承:子类会遗传父类的属性,所以继承是用来解决类与类之间代码冗余的问题
    class OldboyPeople:
    school = 'oldboy'
    def init(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

    class Student(OldboyPeople):
    def init(self,name,age,gender,stud_id):
    OldboyPeople.init(self,name,age,gender)
    self.id = stud_id

    class Teacher(OldboyPeople):
    def init(self,name,age,gender,salary):
    OldboyPeople.init(self,name,age,gender)
    self.salaru = salary

    obj1 = Student('shuai',18,'male',4657) # 学生信息
    obj2 = Teacher('eogn',18,'female',40000) # 老师信息

    可以看到学生类和老师的类都继承了学校的类,因为老师和学生都是一个学校的,且姓名,年龄,性别三个数据都在学校类中

    print(obj2.name) # 老师对象里面继承了学校类里面名字属性 # eogn
    print(obj1.name) # 学生对象里面继承了学校类里面名字属性 # shuai
    通过内置属性bases可以查看到类继承的所有父类
    class Parent1:
    x = 123
    pass
    class Parent2(Parent1):
    y = 456
    pass
    class Parent3(Parent2, Parent1):
    z = 789
    pass
    print(Parent3.bases) # 查看类3继承的父类

    (<class 'main.Parent2'>, <class 'main.Parent1'>)

    python支持多继承,也就是说一个类可以同时继承两个父类(飞机是交通工具,又是飞行器)
    严格意思来说一个类只能继承一个父类,多余的父类只是在原父类基础上增加了一些功能
    class Transportation:
    print('交通工具')

    class AircraftMixin:
    print('交通工具之飞行器功能')

    class Aircraft(AircraftMixin, Transportation):
    print('飞机交通工具') # 该类同时继承两个类,我们认为父类是Transportation,飞机属于交通工具
    # 而AircraftMixin类是飞行器有的功能,属于交通工具额外的功能

    class Helicopter(AircraftMixin, Transportation):
    print('直升飞机交通工具') # 该类同时继承两个类,我们认为父类是Transportation,飞机属于交通工具
    # 而AircraftMixin类是飞行器有的功能,属于交通工具额外的功能

    class Car(Transportation):
    print('汽车交通工具') # 汽车就是交通工具
    派生
    子类会继承父类的属性和功能,这就是派生
    在子类调用父类的属性1:指名道姓父类名.父类数据
    属性查找:
    在python2中没有显式地继承了object的子类,以该子类的子子类都称之为经典类
    显式地继承了object的类,以及该类的子类,子子类都是新式类
    而在python3中全部都是新式类
    说到经典类和新式类就说到了python底层父类查找原理:c3算法
    菱形继承问题
    死亡钻石:一个子类继承的多个分支最终汇聚到一个非object类形成的一个菱形的继承圈;又称死亡钻石
    在菱形继承问题下新式类和经典类的属性查找方式不同
    新式类的查找方式:广度优先
    经典类的查找方式:深度优先
    区别在于广度最后查找object类;而深度顺着一条道直接找到object
    Mixins机制
    Mixins机制核心:就是在多继承的背景下尽可能的提升多继承代码的可读性
    让多继承满足人的思维习惯===>什么'是'什么
    简单来说就是在父类的类名后加上Mixin,那么这个父类名义上是子类的父类,其实只是为了给子类单纯的增加一些额外的功能,我们仍认为子类的父类只有一个
    含Mixin后缀的父类写在左边,真正的父类写在最后边

    相关文章

      网友评论

          本文标题:day26面向对象\继承\Mixins机制

          本文链接:https://www.haomeiwen.com/subject/dpihdktx.html