Eine ausgezeichnete Frage. Ich habe mich auch mit diesem Problem befasst, und obwohl ich zustimme, dass "Fabriken" (Klassen-Methoden-Konstruktoren) eine gute Methode sind, möchte ich eine andere vorschlagen, die ich ebenfalls sehr nützlich finde:
Hier ist ein Beispiel (dies ist ein read
Methode und nicht ein Konstruktor, aber die Idee ist die gleiche):
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
Der Schlüsselgedanke ist hier die Verwendung von Pythons ausgezeichneter Unterstützung für benannte Argumente, um dies zu implementieren. Wenn ich nun die Daten aus einer Datei lesen möchte, sage ich:
obj.read(filename="blob.txt")
Und um es von einer Zeichenkette abzulesen, sage ich:
obj.read(str="\x34\x55")
Auf diese Weise hat der Benutzer nur eine einzige Methode aufzurufen. Der Umgang damit ist, wie Sie gesehen haben, nicht übermäßig komplex