定義介面或者抽象基類
阿新 • • 發佈:2018-12-27
你想定義一個介面或抽象類,並且通過執行型別檢查來確保子類實現了某些特定的方法。
解決方案:
使用 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
抽象類的目的就是讓別的類繼承它並實現特定的抽象方法:
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 。 你只需保證這個註解緊靠在函式定義前即可
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