在我的代码中,我目前有一个 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。这确实有效,即使我不确定所有的影响。
添加回答
举报
0/150
提交
取消