1 回答

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