Supposons que j'ai un fichier foo.py
contenant une classe Foo
:
class Foo(object):
def __init__(self, data):
...
Maintenant, je veux ajouter une fonction qui crée un Foo
objet d'une certaine manière à partir de données source brutes. Dois-je le mettre comme méthode statique dans Foo ou comme une autre fonction distincte?
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))
Je ne sais pas s'il est plus important d'être pratique pour les utilisateurs:
foo1 = foo.makeFoo(sourceData)
ou s'il est plus important de maintenir un couplage clair entre la méthode et la classe:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
, voir Signification de @classmethod et @staticmethod pour débutant?En Python, je préfère généralement une hiérarchie de classes aux méthodes d'usine. Quelque chose comme:
Je vais mettre toute la hiérarchie (et seulement celle-ci) dans un module, disons
foos.py
. La classe de baseFoo
implémente généralement toutes les méthodes (et en tant que telle, l'interface) et n'est généralement pas construite directement par les utilisateurs. Les sous-classes sont un moyen d'écraser le constructeur de base et de spécifier commentFoo
être construit. Ensuite, je créerais unFoo
en appelant le constructeur approprié, comme:Je le trouve plus élégant et flexible que les usines construites à partir de méthodes statiques, de méthodes de classe ou de fonctions de niveau module.
la source