1 回答

TA貢獻1786條經驗 獲得超11個贊
是的,抽象類可以有非抽象方法。
通常我們所說的抽象類只是一個不能被實例化的類。
另一方面,我們所說的接口是一個只有方法聲明而沒有實現的類。特別是它是一個抽象類,因為它沒有構造函數。
當然,在 Python 中沒有真正的接口:每個方法都必須有一個主體。但是我們可以通過raise NotImplementedError().
無論如何,接口形成抽象類的子集。這顯然表明存在不是接口的抽象類。這正是您所描述的情況。是的,抽象類可能包含已實現的非抽象方法。這不是一個壞習慣。當給定方法不依賴于具體實現時,這尤其有用。
例如,考慮一個通用解析器的接口(我正在考慮json.load和json.loads):
class ILoader(ABC):
@abstractmethod
def load(self, stream):
raise NotImplementedError()
loads使用默認實現給出接受字符串而不是流的方法是完全可以的:
class AbstractLoader(ABC):
@abstractmethod
def load(self, stream):
raise NotImplementedError()
def loads(self, text):
stream = io.StringIO(text)
return self.load(stream)
雖然我會使用Abstract前綴而不是I. ;)
添加回答
舉報