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

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

使用協程和函數作為 Python 中的方法,保持可靠和干燥

使用協程和函數作為 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 ...")正如您所看到的,兩個客戶端基本相同,并且應包含相同的名稱(以便每個人都知道會發生什么)?,F在我想干脆地寫bird_async(bird)。因為 in 中的每個擴展也bird應使用 in bird_async。這是可能的,但我的同事說,它不是 SOLID,因為我已經覆蓋了wait_meep. 現在我正在尋找不同的靈魂并找到了抽象類。我不知道的是,創建一個抽象類是否birdBase(ABC)也很可靠。我也會覆蓋那里,因為首先它是一個函數,然后是一個協程,或者我在這里錯了?在不重命名方法的情況下,將這兩個類組合在一起的 SOLID 和 DRY 解決方案是什么?
查看完整描述

2 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

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

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

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

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


查看完整回答
反對 回復 2023-06-27
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

問題

您有兩個具有重復代碼的類,可以利用繼承,但不想覆蓋 wait_meep。此外,其中存在硬編碼文本wait_meepdo_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)

筆記

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



查看完整回答
反對 回復 2023-06-27
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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