Supongamos que tengo un archivo que foo.py
contiene una clase Foo
:
class Foo(object):
def __init__(self, data):
...
Ahora quiero agregar una función que cree un Foo
objeto de cierta manera a partir de datos de origen sin procesar. ¿Debo ponerlo como un método estático en Foo o como otra función 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))
No sé si es más importante ser conveniente para los usuarios:
foo1 = foo.makeFoo(sourceData)
o si es más importante mantener un acoplamiento claro entre el método y la clase:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
, consulte Significado de @classmethod y @staticmethod para principiantes.En Python, generalmente prefiero una jerarquía de clases sobre los métodos de fábrica. Algo como:
Pondré toda la jerarquía (y solo esta) en un módulo, digamos
foos.py
. La clase baseFoo
generalmente implementa todos los métodos (y como tal, la interfaz), y generalmente no es construida por los usuarios directamente. Las subclases son un medio para sobrescribir el constructor base y especificar cómo seFoo
va a construir. Luego crearía unFoo
llamando al constructor apropiado, como:Me parece más elegante y flexible que las fábricas construidas a partir de métodos estáticos, métodos de clase o funciones de nivel de módulo.
fuente