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 类
添加回答
举报