Excellente question. J'ai abordé ce problème ainsi, et alors que je suis d'accord que les "usines" (classe-méthode constructeurs) sont une bonne méthode, je voudrais suggérer une autre, que j'ai également trouvé très utile:
Voici un exemple (c'est un read
méthode et pas un constructeur, mais l'idée est la même):
def read(self, str=None, filename=None, addr=0):
""" Read binary data and return a store object. The data
store is also saved in the interal 'data' attribute.
The data can either be taken from a string (str
argument) or a file (provide a filename, which will
be read in binary mode). If both are provided, the str
will be used. If neither is provided, an ArgumentError
is raised.
"""
if str is None:
if filename is None:
raise ArgumentError('Please supply a string or a filename')
file = open(filename, 'rb')
str = file.read()
file.close()
...
... # rest of code
L'idée clé est ici est à l'aide de Python est un excellent support pour les arguments nommés pour le mettre en œuvre. Maintenant, si je veux lire les données à partir d'un fichier, je dis:
obj.read(filename="blob.txt")
Et de le lire à partir d'une chaîne, je dis:
obj.read(str="\x34\x55")
De cette façon, l'utilisateur a juste une seule méthode à appeler. La manipulation de l'intérieur, comme vous l'avez vu, n'est pas trop complexe