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

在我的代码中,我目前有一个 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 噪音,那就更好了。


MMMHUHU
浏览 152回答 2
2回答

森栏

一个可能的解决方案如下: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。这确实有效,即使我不确定所有的影响。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python