針對接口編程,而不是針對實現編程,這是四人組的經典名做《設計模式 可複用面向對象軟件的基礎》的第一個原則。python
你想定義一個接口或抽象類,而且經過執行類型檢查來確保子類實現了某些特定的方法。編程
解決方案:
使用 abc
模塊能夠很輕鬆的定義抽象基類設計模式
from abc import ABCMeta, abstractmethod class IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxbytes=-1): pass @abstractmethod def write(self, data): pass
抽象類的一個特色是它不能直接被實例化,好比你想像下面這樣作是不行的:函數
a = IStream() >>>TypeError: Can't instantiate abstract class IStream with abstract methods read, write
抽象類的目的就是讓別的類繼承它並實現特定的抽象方法:spa
class SocketStream(IStream): def read(self, maxbytes=-1): pass def write(self, data): pass
抽象基類的一個主要用途是在代碼中檢查某些類是否爲特定類型,實現了特定接口:設計
def serialize(obj, stream): if not isinstance(stream, IStream): raise TypeError('Expected an IStream') pass
@abstractmethod 還能註解靜態方法、類方法和 properties 。 你只需保證這個註解緊靠在函數定義前便可code
class A(metaclass=ABCMeta): @property @abstractmethod def name(self): pass @name.setter @abstractmethod def name(self, value): pass @classmethod @abstractmethod def method1(cls): pass @staticmethod @abstractmethod def method2(): pass