亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將通用方法放在 Python 中的抽象類中是一個好習慣嗎?

將通用方法放在 Python 中的抽象類中是一個好習慣嗎?

慕妹3146593 2021-08-11 20:08:20
我正在使用該abc模塊來定義子類必須支持的接口。還有一些通用方法存在于所有子類中??梢詫⑺鼈兎旁诔橄箢愔羞€是應該只包含抽象方法(即用 裝飾@abc.abstractmethod)?
查看完整描述

1 回答

?
Qyouu

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


查看完整回答
反對 回復 2021-08-11
  • 1 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號