Python多继承的正确打开方式:mixins机制 一:Python多继承的正确打开方式:mixins机制 二:例子

Mixins核心:在多继承背景下,尽可能地提升多继承的可读性

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

# PI = 3.1415926
 

二:例子

class Vehicle:  # 交通工具
    def fly(self):
        print("I am flying")

class CivilAircraft(Vehicle): # 民航飞机
pass

class Helicopter(Vehicle): # 直升飞机
pass

class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass

class Vehicle:  # 交通工具
    pass


class Flyable:	# 新建一个类Flyable,只当做可飞行交通工具的父类
    def fly(self):
        print("I am flying")


class CivilAircraft(Vehicle, Flyable):  # 民航飞机
    pass


class Helicopter(Vehicle, Flyable):  # 直升飞机
    pass


class Car(Vehicle):
    pass

  Python语言可没有接口功能,但是它可以多重继承。那Python是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则。

class Vehicle:  # 交通工具
    pass

class FlyableMixin: # 加一个Mixin结尾,可以当做一个假父类混入区中
def fly(self):
print("I am flying")

class CivilAircraft(Vehicle, FlyableMixin): # 民航飞机
pass

class Helicopter(Vehicle, FlyableMixin): # 直升飞机
pass

class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass

这里可以看到,CivilAircraft和Helicopter都继承了Vehicle,还有FlyableMixin,但是FlyableMixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。
使用Mixin类实现多重继承要非常小心
	1.首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
	2.其次它必须责任单一,如果有多个功能,那就写多个Mixin类
	3.然后,它不依赖于子类的实现
	4.最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。

Mixins核心:在多继承背景下,尽可能地提升多继承的可读性

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

# PI = 3.1415926
 

二:例子

class Vehicle:  # 交通工具
    def fly(self):
        print("I am flying")

class CivilAircraft(Vehicle): # 民航飞机
pass

class Helicopter(Vehicle): # 直升飞机
pass

class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass

class Vehicle:  # 交通工具
    pass


class Flyable:	# 新建一个类Flyable,只当做可飞行交通工具的父类
    def fly(self):
        print("I am flying")


class CivilAircraft(Vehicle, Flyable):  # 民航飞机
    pass


class Helicopter(Vehicle, Flyable):  # 直升飞机
    pass


class Car(Vehicle):
    pass

  Python语言可没有接口功能,但是它可以多重继承。那Python是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则。

class Vehicle:  # 交通工具
    pass

class FlyableMixin: # 加一个Mixin结尾,可以当做一个假父类混入区中
def fly(self):
print("I am flying")

class CivilAircraft(Vehicle, FlyableMixin): # 民航飞机
pass

class Helicopter(Vehicle, FlyableMixin): # 直升飞机
pass

class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass

这里可以看到,CivilAircraft和Helicopter都继承了Vehicle,还有FlyableMixin,但是FlyableMixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。
使用Mixin类实现多重继承要非常小心
	1.首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
	2.其次它必须责任单一,如果有多个功能,那就写多个Mixin类
	3.然后,它不依赖于子类的实现
	4.最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。