1. 程式人生 > >定義介面或者抽象基類

定義介面或者抽象基類

你想定義一個介面或抽象類,並且通過執行型別檢查來確保子類實現了某些特定的方法。

解決方案:

使用 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