第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將通用方法放在 Python 中的抽象類(lèi)中是一個(gè)好習(xí)慣嗎?

將通用方法放在 Python 中的抽象類(lèi)中是一個(gè)好習(xí)慣嗎?

慕妹3146593 2021-08-11 20:08:20
我正在使用該abc模塊來(lái)定義子類(lèi)必須支持的接口。還有一些通用方法存在于所有子類(lèi)中。可以將它們放在抽象類(lèi)中還是應(yīng)該只包含抽象方法(即用 裝飾@abc.abstractmethod)?
查看完整描述

1 回答

?
Qyouu

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. ;)


查看完整回答
反對(duì) 回復(fù) 2021-08-11
  • 1 回答
  • 0 關(guān)注
  • 190 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)