zoukankan      html  css  js  c++  java
  • mixin与派生

    一、mixin

    多继承的正确打开方式:mixins机制

    mixins机制核心:就是在多继承背景下尽可能地提升多继承的可读性

    ps:让多继承满足人的思维习惯=》什么"是"什么

    class Vehicle:
        pass
    
    class FlyableMixin:
        def fly(self):
            pass
    
    class CivilAircraft(FlyableMixin,Vehicle):  # 民航飞机
        pass
    
    class Helicopter(FlyableMixin,Vehicle):  # 直升飞机
        pass
    
    class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
        pass
    

    使用Mixin类实现多重继承要非常小心

    • 首先它必须表示某一种功能,而不是某个物品,python 对于mixin类的命名方式一般以 Mixin, able, ible 为后缀
    • 其次它必须责任单一,如果有多个功能,那就写多个Mixin类,一个类可以继承多个Mixin,为了保证遵循继承的“is-a”原则,只能继承一个标识其归属含义的父类
    • 然后,它不依赖于子类的实现
    • 最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了)

    二、派生

    派生:子类中衍生出的新东西
        1、子类独有,父类没有
        2、子类有,父类也有,子类是完全覆盖父类的
        3、子类有,父类也有,子类是在父类的基础上进行拓展
    

    在子类派生的新方法中如何重用父类的功能

    方式一:指名道姓调用某一个类下的函数=》不依赖于继承关系

    class OldboyPeople:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def f1(self):
            print('%s say hello' %self.name)
    
    
    class Teacher(OldboyPeople):
        def __init__(self,name,age,sex,level,salary):
            OldboyPeople.__init__(self,name,age,sex)
    
            self.level = level
            self.salary=salary
    
    tea_obj=Teacher('egon',18,'male',10,3000)
    print(tea_obj.__dict__)
    {'name': 'egon', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}
    

    方式二:super()调用父类提供给自己的方法=》严格依赖继承关系

    调用super()会得到一个特殊的对象,该对象会参照发起属性查找的那个类的mro,去当前类的父类中

    class OldboyPeople:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def f1(self):
            print('%s say hello' %self.name)
    
    
    class Teacher(OldboyPeople):
        def __init__(self,name,age,sex,level,salary):
            # super(Teacher,self).__init__(name,age,sex)
            super().__init__(name,age,sex) # 调用的是方法,自动传入对象
    
            self.level = level
            self.salary=salary
    
    # print(Teacher.mro())
    tea_obj=Teacher('egon',18,'male',10,3000)
    print(tea_obj.__dict__)
    {'name': 'egon', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}
    
    # super()案例
    class A:
        def test(self):
            print('from A')
            super().test()
    
    class B:
        def test(self):
            print('from B')
    
    class C(A,B):
        pass
    
    
    obj=C()
    obj.test()
    print(C.mro())
    
    from A
    from B
    [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
    
    
  • 相关阅读:
    转 将python的datetime转换为unix时间戳
    VMware 虚拟机中添加新硬盘的方法
    UBUNTU 安装 nodejs
    ubuntu 20 查看site-package 目录
    基于C++代码的UE4学习(四)—— 定时器
    ObjectMapper 动态用法
    关于Mybatis中Mapper是使用XML还是注解的一些思考
    Spring Boot 中使用 Jedis 及 Lettuce的对比
    批量切换版本
    Build OpenJdk
  • 原文地址:https://www.cnblogs.com/chenyoupan/p/12675974.html
Copyright © 2011-2022 走看看