接口類的多繼承以及抽象類的單繼承

接口類的多繼承以及抽象類的單繼承python

1、接口類(面向對象開發的思想和規範)的多繼承設計模式

需求:函數

定義一個tiger類:會走,會遊spa

定義一個hawk類:會走,會飛操作系統

定義一個swan類:會走,會遊,會飛設計

(a)若是像如下代碼的方式,則不可以知足以上的需求,只有swan的實例化纔是正確的,其餘兩個tiger類和hawk類則不能知足code

class Animal:
    def walk(self):
        pass
    def swim(self):
        pass
    def fly(self):
        pass
tiger = Animal()
swan = Animal()
hawk = Animal()

 

(b)而如下代碼確切定義每個類,每一個類的屬性都都在類裏面存在,這樣寫雖然能夠知足前面的需求,可是很差的地方就是,重複的方法太多,顯得累贅對象

class Tiger:
    def walk(self):
        pass
    def swim(self):
        pass
class Hawk:
    def walk(self):
        pass
    def fly(self):
        pass
class Swan:
    def walk(self):
        pass
    def swim(self):
        pass
    def fly(self):
        pass
tiger = Tiger()
swan = Swan()
hawk = Hawk()

 

(c)如下代碼使用了接口類的多繼承,雖然代碼看起來仍是和(b)同樣有點多,可是它起到了一個規範的做用,不容易出錯,出錯了了也更容易找到出錯的地方,一出現錯誤,就說明,子類中不存在與父類中同名的方法和函數,而後作出對應的修改便可blog

from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):  # 父類,接口類有一個規範的做用
    @abstractmethod  # 語法糖,直接用別人寫好的代碼
    def swim(self):  # 接口類裏面的方法函數都不會執行實現,不然就是子類不存在接口類的方法函數,就會報錯
        pass
    
class Walk_Animal(metaclass=ABCMeta):  # 父類,接口類有一個規範的做用
    @abstractmethod  # 語法糖,直接用別人寫好的代碼
    def walk(self):  # 接口類裏面的方法函數都不會執行實現,不然就是子類不存在接口類的方法函數,就會報錯
        pass

class Fly_Animal(metaclass=ABCMeta):  # 父類,接口類有一個規範的做用
    @abstractmethod  # 語法糖,直接用別人寫好的代碼
    def fly(self):  # 接口類裏面的方法函數都不會執行實現,不然就是子類不存在接口類的方法函數,就會報錯
        pass

class Tiger(Walk_Animal,Swim_Animal):pass  # 子類,繼承多個父類,類裏面應該含有對應父類中方法和函數
class Hawk(Walk_Animal,Fly_Animal):pass  # 子類,繼承多個父類,類裏面應該含有對應父類中方法和函數
class Swan(Walk_Animal,Swim_Animal,Fly_Animal):pass  # 子類,繼承多個父類,類裏面應該含有對應父類中方法和函數

 

從(a)和(c)接口類的多繼承的代碼也能夠比較容易理解在使用接口類經常使用的一個原則:繼承

接口隔離原則:使用多個專門的接口(,多個規範,多個父類),而不使用單一的總接口(單一的父類),即客戶端不該該依賴那些不須要的接口

 

2、抽象類的單繼承

若是說類是從一堆對象中抽取相同的內容而來,那麼抽象類就是從一堆類中抽取相同的內容而來的,內容包括數據屬性和函數屬性,如下用一個例子來講明什麼是抽象類

對於操做系統來講,一切皆是文件,利用abc模塊能夠實現抽象類

import abc
class ALL_file(metaclass=abc.ABCMeta):
    all_type = 'file'
    @abc.abstractmethod  # 定義抽象方法,無需實現功能,裝飾器
    def read(self):
        '子類必須定義讀功能'
        with open('filename') as f:  # 還能夠在這裏實現其餘的方法,但子類必需要有read方法
    @abc.abstractmethod  # 定義抽象方法,無需實現功能
    def write(self):
        '子類必須定義寫功能'
        pass   # 還能夠在這裏實現其餘的方法,但子類必需要有write方法
    

class Txt(ALL_file):pass  # 單繼承,必需要有read和write的方法
class Sata(ALL_file):pass  # 單繼承,必需要有read和write的方法
class Process(ALL_file):pass  # 單繼承,必需要有read和write的方法

 

3、接口類和抽象類的小結

不管是接口類仍是抽象類都是面向對象的開發規範,都不能實例化

 

 

(1)Java:Java裏面全部的類都是單繼承,因此抽象類完美的解決了單繼承需求中的規範問題;可是對於多繼承的需求,Java自己語法不支持,因此建立了接口interface這個概念來解決多繼承問題

(2)python:因爲python也想用這種相似的設計模式,因此模仿Java中接口類和抽象類的概念,只不過概念比較模糊。python中沒有接口類,可是它自己支持的多繼承並用class能夠實現和接口類同樣的功能效果;而python中支持抽象類,即單繼承的方法就能夠實現抽象類的功能做用

相關文章
相關標籤/搜索