• 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'>]
    
    
  • 相关阅读:
    C/C++程序员应聘常见面试题剖析(经典)
    连续几个数组在内存中的存储地址
    虚析构函数
    c++中的函数模版和类模版
    C++多态性(续)
    malloc和new的区别和联系
    深入浅出多线程系列之四:简单的同步 lock
    Silverlight_Rest_WCF系列之六:跨线程
    深入浅出多线程系列之五:一些同步构造(下篇)
    深入浅出多线程系列之五:一些同步构造(上篇)
  • 原文地址:https://www.cnblogs.com/chenyoupan/p/12675974.html
Copyright © 2020-2023  润新知