Предположим, у меня есть файл, foo.py
содержащий класс Foo
:
class Foo(object):
def __init__(self, data):
...
Теперь я хочу добавить функцию, которая Foo
определенным образом создает объект из необработанных исходных данных. Должен ли я поместить его как статический метод в Foo или как другую отдельную функцию?
class Foo(object):
def __init__(self, data):
...
# option 1:
@staticmethod
def fromSourceData(sourceData):
return Foo(processData(sourceData))
# option 2:
def makeFoo(sourceData):
return Foo(processData(sourceData))
Не знаю, важнее ли быть удобным для пользователей:
foo1 = foo.makeFoo(sourceData)
или более важно поддерживать четкую связь между методом и классом:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
см. Значение @classmethod и @staticmethod для начинающих?В Python я обычно предпочитаю иерархию классов фабричным методам. Что-то типа:
Я положу всю иерархию (и только эту) в модуль, скажем
foos.py
. Базовый классFoo
обычно реализует все методы (и, как таковой, интерфейс) и обычно не создается пользователями напрямую. Подклассы - это средство перезаписи базового конструктора и определения способаFoo
его построения. Затем я бы создалFoo
, вызвав соответствующий конструктор, например:Я нахожу его более элегантным и гибким, чем фабрики, построенные из статических методов, методов класса или функций уровня модуля.
источник