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

实例化对象在 ABC 的不同具体实现之间进行选择

实例化对象在 ABC 的不同具体实现之间进行选择

MMMHUHU 2021-09-02 14:47:39
在我的代码中,我目前有一个 class Obj,实现了一些低级功能,没有什么特别的。现在,我需要添加Obj. 应该根据一些属性来决定实例化哪个实现,在实例化时进行检查。我想出的解决方案是拥有一个抽象类_absObj,以及它的两个实现,_Obj1以及_Obj2. 我仍然想在 API 级别只展示一个Obj类,所以我重新实现Obj如下:class Obj:    __new__(cls, stuff):        if _check_something(stuff):            return _Obj1(stuff)        else:            return _Obj2(stuff)这工作正常,但我看到了一些不便:[minor]Obj没有记录的方法。可能这实际上是一个优势。[major]Obj不是 的子类absObj,即使从它实例化的每个对象都派生自抽象类。[major] 在测试中,我经常需要 mock Obj,但我无法 mock 任何方法,它没有!我只能模拟它的一个实现,这是脆弱的,因为我可能会更改实现,或者实例化的实现可能会更改。有没有更聪明的解决方案?如果解决方案意味着倾销一些 oop 噪音,那就更好了。
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

一个可能的解决方案如下:


class Obj(ABC):

    @abstractmethod

    def f1(...):

        pass


    @abstractmethod

    def f1(...):

        pass


    @classmethod

    def factory(stuff):

        if _check_something(stuff):

             return _Obj1(stuff)

        else:

             return _Obj2(stuff)

从哪里_Obj1和_Obj2派生而来Obj。这确实有效,即使我不确定所有的影响。


查看完整回答
反对 回复 2021-09-02
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

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