废话不多说,还是坚持代码驱动,先看代码,引出问题
一,python多继承 父类存在同名方法
class land(object):
def me(self):
print('land')
def run(self):
print('run...')
class sky(object):
def me(self):
print('fly')
def fly(self):
print('fly...')
class plane(land, sky):
pass
p = plane()
p.run()
p.fly()
p.me()
Output:
run...
fly...
land
可以看到,land类和sky类都有 me方法,然而plane最后却选择了land的方法,这说明多继承时,如果父类方法同名,优先级从左往右。
那么想要调用sky的me方法该怎么办?
class plane(land, sky):
def me(self):
super().me() #land的me
super(plane,self).me() #land的me
super(land,self).me() #sky的me
p = plane()
p.me()
Output:
land
land
fly
修改的plane就是上面这样,所以默认调用的从左往右第一个,但实际上可以调用任意一个。
二,java单继承多实现
java是单继承的,所以不会出现多继承上述问题。有的人会说不是有多实现么?那么多实现的时候,接口有同名方法怎么处理?
搞清楚里面的关系:
接口的实现是交给了实现类的,那么不存在实现类调用接口方法的问题,而是接口调用继承了自己类的具体实现。
三,MixIn
继承一般有一条主线,当主线满足不了需求,需要添加那些不在主线上的功能的时候,就需要继承别的类,这个时候可以把这种类设计成Mixin——也就是仅仅提供新功能组合出更强大的功能,而不改变原有的继承主线结构。
Mixin只是一个名字而已,python里也确实有以Mixin结尾的这种设计。其实细细品味下来,Mixin和java的Interface有异曲同工之妙,都是为了提倡功能组合来简化继承结构。