В моем коде в настоящее время у меня есть класс Obj
, реализующий некоторые низкоуровневые функциональные возможности, ничего особенного.Теперь мне нужно добавить вторую реализацию Obj
.Какая реализация создается, должно быть решено на основе некоторых свойств, которые должны быть проверены во время создания экземпляра.
Решение, которое я придумал, состоит в том, чтобы иметь абстрактный класс _absObj
и две его реализации, _Obj1
и _Obj2
.Я все еще хочу представить на уровне API только один класс Obj
, поэтому я заново реализовал Obj
просто так:
class Obj:
__new__(cls, stuff):
if _check_something(stuff):
return _Obj1(stuff)
else:
return _Obj2(stuff)
Это прекрасно работает, но я вижу несколько неудобств:
- [несовершеннолетний]
Obj
не имеет документированных методов.Вероятно, это на самом деле преимущество. - [major]
Obj
не является подклассом absObj
, даже если каждый объект, экземпляр которого создан из него, происходит от абстрактного класса. - [major]В тестах мне часто нужно высмеивать
Obj
, но я не могу высмеять ни один из его методов, у него нет ни одного!Я могу только посмеяться над одной из его реализаций, которая является хрупкой, поскольку я могу изменить реализацию, или может быть изменена конкретная реализация.
Есть ли более разумное решение?Если решение подразумевает сброс некоторого шума, еще лучше.