Suponha que eu tenha um arquivo foo.py
contendo uma classe Foo
:
class Foo(object):
def __init__(self, data):
...
Agora eu quero adicionar uma função que cria um Foo
objeto de uma certa maneira a partir de dados brutos de origem. Devo colocá-lo como um método estático no Foo ou como outra função separada?
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))
Não sei se é mais importante ser conveniente para os usuários:
foo1 = foo.makeFoo(sourceData)
ou se é mais importante manter um acoplamento claro entre o método e a classe:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
saber mais , consulte Significado de @classmethod e @staticmethod para iniciantes?No Python, eu geralmente prefiro uma hierarquia de classes sobre os métodos de fábrica. Algo como:
Vou colocar toda a hierarquia (e somente essa) em um módulo, digamos
foos.py
. A classe baseFoo
geralmente implementa todos os métodos (e, como tal, a interface) e geralmente não é construída diretamente pelos usuários. As subclasses são um meio de substituir o construtor de base e especificar comoFoo
deve ser construído. Então eu criaria umFoo
chamando o construtor apropriado, como:Acho mais elegante e flexível do que fábricas construídas a partir de métodos estáticos, métodos de classe ou funções no nível de módulo.
fonte