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

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

使用協(xié)程和函數(shù)作為 Python 中的方法,保持可靠和干燥

使用協(xié)程和函數(shù)作為 Python 中的方法,保持可靠和干燥

天涯盡頭無女友 2023-06-27 13:45:34
我有那個代碼示例:from time import sleepimport asyncioclass bird:    def __init__(self, sleeptime=1):        self.var = sleeptime    def wait_meep(self):        sleep(self.var)        print("Meep")    def do_sth(self):        print("Dop Dop Do do ...")class bird_async:    def __init__(self, sleeptime=1):        self.var = sleeptime    async def wait_meep(self):        await asyncio.sleep(self.var)        print("Meep")    def do_sth(self):        print("Dop Dop Do do ...")正如您所看到的,兩個客戶端基本相同,并且應(yīng)包含相同的名稱(以便每個人都知道會發(fā)生什么)?,F(xiàn)在我想干脆地寫bird_async(bird)。因為 in 中的每個擴展也bird應(yīng)使用 in bird_async。這是可能的,但我的同事說,它不是 SOLID,因為我已經(jīng)覆蓋了wait_meep. 現(xiàn)在我正在尋找不同的靈魂并找到了抽象類。我不知道的是,創(chuàng)建一個抽象類是否birdBase(ABC)也很可靠。我也會覆蓋那里,因為首先它是一個函數(shù),然后是一個協(xié)程,或者我在這里錯了?在不重命名方法的情況下,將這兩個類組合在一起的 SOLID 和 DRY 解決方案是什么?
查看完整描述

2 回答

?
大話西游666

TA貢獻1817條經(jīng)驗 獲得超14個贊

DRY 解決方案是某種子類化,就像您已經(jīng)做的那樣。

我認為在您的情況下很難實現(xiàn)“SOLID”解決方案。事實是,您有兩個函數(shù)wait_meep,它們實際上具有不同的簽名和語義。也就是說,第一個塊用于睡眠間隔,該間隔可以是任意長的。第二個 OTOH 是異步的,即需要特殊的調(diào)用語義并同時運行。

一個類似的例子是Queue標準庫中的類。這里有get一些get_nowait方法以不同的方式做同樣的事情。第二個例子可以是__iter____aiter__方法。

所以我認為唯一的“正確”解決方案是重命名其中一種方法。這會產(chǎn)生副作用,您可以將其全部編寫為一個類,即減少移動部件的數(shù)量。


查看完整回答
反對 回復(fù) 2023-06-27
?
呼啦一陣風(fēng)

TA貢獻1802條經(jīng)驗 獲得超6個贊

問題

您有兩個具有重復(fù)代碼的類,可以利用繼承,但不想覆蓋 wait_meep。此外,其中存在硬編碼文本wait_meep,do_sth無法自定義。

解決方案

請考慮以下事項以使您的代碼更加堅固和干燥:

from time import sleep

import asyncio


class Bird:

    DEFAULT_WAIT_MEEP_TEXT = "Meep"

    DEFAULT_DO_STH_TEXT = "Dop Dop Do do ..."


    def __init__(self, sleeptime=1):

        self.sleeptime = sleeptime


    def wait_meep(self, text=DEFAULT_WAIT_MEEP_TEXT):

        sleep(self.sleeptime)

        print(text)

        

    def do_sth(self, text=DEFAULT_DO_STH_TEXT):

        print(text)



class BirdAsync(Bird):

    async def wait_meep_async(self, text=DEFAULT_WAIT_MEEP_TEXT):

        await asyncio.sleep(self.var)

        print(text)

筆記

這里的想法是創(chuàng)建一個特定的方法來執(zhí)行異步(DRY)并確保硬編碼的默認值改為在 args 中傳遞(開閉原則)。當(dāng)然,這一切都可以在原始 Bird 類中完成,而不需要 BirdAsync 類



查看完整回答
反對 回復(fù) 2023-06-27
  • 2 回答
  • 0 關(guān)注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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