为了账号安全,请及时绑定邮箱和手机立即绑定

使用协程和函数作为 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 ...")正如您所看到的,两个客户端基本相同,并且应包含相同的名称(以便每个人都知道会发生什么)。现在我想干脆地写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 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信