当前位置: 首页 > 后端技术 > Python

如果使用多重继承,请考虑mix-in混合类

时间:2023-03-26 14:17:53 Python

为什么要使用mix-in混合类Python是一门面向对象的编程语言,它提供了一些内置的编程机制让开发者可以正确的实现多重继承,即就是,一个子类可以继承多个父类,但是多重继承的设计经常被人诟病,因为它违反了“is-a”的关系。但也有需要多重继承的情况。比如car是交通工具,那么car类应该继承交通工具的父类。商用飞机呢?也是一种交通工具,所以也应该继承交通工具的父类,但是交通工具类应该怎么设计呢?应该实施飞行吗?如果实现了,小车继承车辆的父类显然是不合适的,因为小车根本没有飞行功能。如果不实施,民航飞机继承载具类也不合适。如果两者分别实现各自的方法,就会违反代码复用的原则,那么这个问题应该如何解决呢?其实我们可以抽象出地面上跑的,天上飞的,甚至是水上漂浮的工具的功能来实现交通工具的父类的。对于飞机,继承运输和飞行功能这两个父类;对于船舶,继承运输和水上漂流功能这两个父类。但是这种多重继承说到底还是违背了“is-a”的原则。应该如何处理这个问题?其实在Python中,可以这样处理,见例1#Example1classVehicle(object):defmove(self):print("Icanmoveontheroad")classFlyMixin(object):deffly(self):print("Icanflyinthesky")classAirplane(Vehicle,FlyMixin):pass例1中Airplane继承了Vehicle和PlaneMixin。这是多重继承吗?其实可以说是,也可以说不是。因为从语法上来说,确实是多重继承。但是要注意Airplane的二次继承是类名有“mixin”,说明这是一个混合类(mix-inclass),会告诉看代码的人这个FlyMixin类是只是一个辅助功能。它只是给类增加了某个功能,即使不继承FlyMixin类也没有作用。mix-in是一个小类,它只定义了一组其他类可能需要的附加方法,而没有定义自己的实例属性。此外,它不需要用户调用自己的构造函数。了解了mix-in类之后,我们来看一下Example2的例子#Example2classAnimal(object):defrun(self):print("Icanrun!")defeat(self):print(“我可以吃!”)defdrink(self):print(“我可以喝”)defsleep(self):print(“我可以睡觉”)classAnimalMixin(object):defmaketools(self):print(“我会制作工具!”)classPerson(Animal,AnimalMixin):defsuperpower(self):super().maketools()Jack=Person()Jack.superpower()#Outputresult:我会制作工具!人类和其他动物都有跑、吃、喝、睡的方法,但人类和其他动物的区别在于,人类会制造工具。所以我们在mix-in类中实现了maketools方法,用于给Person类增加一个额外的功能。在实现Person类时,我们继承了Animal父类和AnimalMixin混合类。继承的UML图如下图所示:说到多重继承,就不得不说到方法顺序解释(MRO)。当子类调用super()时,它指示搜索方法的顺序。print(Person.__mro__)#输出结果:#(,,,)super()search顺序如下图(虚线)所示。mixin应该注意它应该代表某种功能。必须负责单个功能,如果需要多个功能,请实现多个Mix-in类。不依赖于子类的实现。即使子类没有实现Mix-in类,也能正常工作,只是少了一个功能。公众号:CVpython专注于Python和计算机视觉的分享。我们坚持原创,不时更新。希望我们的文章能给您带来启发,共同进步。