定義接口或者抽象基類

針對接口編程,而不是針對實現編程,這是四人組的經典名做《設計模式 可複用面向對象軟件的基礎》的第一個原則。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
相關文章
相關標籤/搜索