2 回答

TA貢獻1817條經驗 獲得超14個贊
DRY 解決方案是某種子類化,就像您已經做的那樣。
我認為在您的情況下很難實現“SOLID”解決方案。事實是,您有兩個函數wait_meep
,它們實際上具有不同的簽名和語義。也就是說,第一個塊用于睡眠間隔,該間隔可以是任意長的。第二個 OTOH 是異步的,即需要特殊的調用語義并同時運行。
一個類似的例子是Queue
標準庫中的類。這里有get
一些get_nowait
方法以不同的方式做同樣的事情。第二個例子可以是__iter__
和__aiter__
方法。
所以我認為唯一的“正確”解決方案是重命名其中一種方法。這會產生副作用,您可以將其全部編寫為一個類,即減少移動部件的數量。

TA貢獻1802條經驗 獲得超6個贊
問題
您有兩個具有重復代碼的類,可以利用繼承,但不想覆蓋 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)
筆記
這里的想法是創建一個特定的方法來執行異步(DRY)并確保硬編碼的默認值改為在 args 中傳遞(開閉原則)。當然,這一切都可以在原始 Bird 類中完成,而不需要 BirdAsync 類
添加回答
舉報