Передача объектов в __init__ или передача общего параметра и построение объектов внутри __init__?

У меня есть класс Foo, который создает экземпляры других классов A, B и C в его конструкторе. A, B и C используют один и тот же конструктор и используются в других частях кода, а не только в Foo. A, B и C доступ к внешнему ресурсу, настроенному переданным параметром. В модульных тестах A, B, и C высмеиваются с помощью unittest.mock.patch.

class Foo(object):
    def __init__(self, param):
        self.a = A(param)
        self.b = B(param)
        self.c = C(param)

foo = Foo('param')

Будет ли следующее улучшение или просто лишний код? Проходит в unittest.mock.Mock объекты в тестах, предпочитаемых с использованием unittest.mock.patch

class Foo(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    @classmethod
    def from_param(cls, param):
        return cls(A(param), B(param), C(param))

foo = Foo.from_param('param')
2 голоса | спросил user95275 20 Jpm1000000pmWed, 20 Jan 2016 21:45:24 +030016 2016, 21:45:24

1 ответ


1

Это немного сложно рассуждать изолированно, но мне, как правило, нравится второй подход. Это дает вам гибкость для передачи любых трех объектов (включая ваши макеты). Если это не классовый инвариант, все они строятся с одинаковыми параметрами, это кажется хорошим. classmethod вы указываете, что хотите A, B, C с теми же параметрами делает его еще удобным для использования в общем случае. И вы можете добавить дополнительные функции фабрики позже, тогда возникнет необходимость.

Конечно, вы не должны слишком абстрагироваться, но тот факт, что вы думаете насмешливо, намекает мне, что это не так.

ответил 5gon12eder 20 Jpm1000000pmWed, 20 Jan 2016 23:31:29 +030016 2016, 23:31:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132