若用多重继承 必定要考虑mix-in混合类

为何要用mix-in混合类

Python是面向对象的编程语言,它提供了一些内置的编程机制,使得开发者能够适当地实现多重继承,即一个子类能够继承多个父类,可是多重继承的设计常常被人诟病,由于它违背了“is-a”的关系。可是也存在须要多重继承的状况。python

例如,轿车是一个交通工具,因此轿车类应该继承交通工具这个父类。那民航飞机呢?它也属于交通工具的一种,因此也应该继承交通工具这个父类,可是交通工具这个类应该怎么设计?是否应该实现飞行功能?若是实现,那轿车继承交通工具父类显然不合适,由于轿车根本没有飞行功能。若是不实现,民航飞机继承交通工具类也一样不合适。若是二者都分别实现本身的方法,那将会违背代码重用的原则,那应该这么解决这个问题?事实上,咱们能够把地上跑的,天上飞的,甚至水上漂的这些工具的功能抽象出来实现交通工具这个父类。对于飞机来讲,那就去继承交通工具和有飞行功能两个父类,对于船来讲,那就去继承交通工具和有水上漂功能的两个父类。可是这样子的多重继承说到底仍是违背了“is-a”的原则,这个问题应该怎么样处理?编程

其实在Python里,是能够这样子处理的,看示例1。编程语言

#示例1
class Vehicle(object):
    def move(self):
    	print("I can move on the road")

class FlyMixin(object):
    def fly(self):
        print("I can fly in the sky")

class Airplane(Vehicle, FlyMixin):
    pass

在示例1中,Airplane继承了Vehicle和PlaneMixin两个类,这是多重继承吗?其实能够说是,也能够说不是。由于从语法上来讲,的确是多重继承。不过要注意的是Airplane第二个继承的是类名称有“mixin”,说明这是一个混合类(mix-in类),它会告诉读代码的人,这个FlyMixin类只是起到一个辅佐做用,它只是把某一个功能添加到类中,即便没有继承这个FlyMixin类也没有影响。mix-in是一个小型的类,它只是定义了其余类可能须要的一套附加方法,而不定义本身实例属性,此外,它也不要求使用者调用本身的构造器。工具

了解完mix-in类,咱们一块儿来看看示例2的例子。设计

#示例2
class Animal(object):
    def run(self):
        print("I can run!")
        
    def eat(self):
        print("I can eat!")
	
    def drink(self):
        print("I can drink")
        
    def sleep(self):
        print("I can sleep")
        
class AnimalMixin(object):
	def maketools(self):
        print("I can make tools!")

class Person(Animal, AnimalMixin):
    def superpower(self):
        super().maketools()
        
Jack = Person()
Jack.superpower()
#输出结果:I can make tools!

人和其余动物都具备run,eat,drink,sleep方法,可是人和其余动物的区别是人能够制造工具。因此咱们在mix-in类中实现maketools方法,它用于给Person类添加一个额外功能咱们在实现Person类的时候,继承了Animal父类和AnimalMixin混合类。继承的UML图以下图所示:code

说到多重继承,不得不说一下方法顺序解释(MRO),当子类调用super()放时候,它指明了查找方法的顺序。对象

print(Person.__mro__)
#输出结果:
# (<class '__main__.Person'>, <class '__main__.Animal'>, <class '__main__.AnimalMixin'>, <class 'object'>)

super()查找顺序以下图所示(虚线)。继承

混合类应该要注意

  • 它应该表示某一种功能。
  • 它必须负责单一的功能,若是须要多功能,请实现多个Mix-in类。
  • 不依赖子类的实现。
  • 子类即便没有实现Mix-in类,也能够正常工做,只是少了一个功能罢了。

公众号: CVpython开发

专一于分享Python和计算机视觉,咱们坚持原创,不按期更新,但愿咱们的文章能够启发到你,一块儿进步。快点扫码关注我吧。class

相关文章
相关标签/搜索