1. 程式人生 > >python多繼承父類存在同名方法和MaxIn

python多繼承父類存在同名方法和MaxIn

廢話不多說,還是堅持程式碼驅動,先看程式碼,引出問題

一,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是單繼承的,所以不會出現多繼承上述問題。有的人會說不是有多實現麼?那麼多實現的時候,介面有同名方法怎麼處理?

搞清楚裡面的關係:

介面的實現是交給了實現類的,那麼不存在實現類呼叫介面方法的問題,而是介面呼叫繼承了自己類的具體實現。

三,MaxIn

繼承一般有一條主線,當主線滿足不了需求,需要新增那些不在主線上的功能的時候,就需要繼承別的類,這個時候可以把這種類設計成MaxIn——也就是僅僅提供新功能組合出更強大的功能,而不改變原有的繼承主線結構。

MaxIn只是一個名字而已,python裡也確實有以MaxIn結尾的這種設計。其實細細品味下來,MaxIn和java的Interface有異曲同工之妙,都是為了提倡功能組合來簡化繼承結構。