Angenommen, ich habe eine Datei foo.py
mit einer Klasse Foo
:
class Foo(object):
def __init__(self, data):
...
Jetzt möchte ich eine Funktion hinzufügen, die ein Foo
Objekt auf eine bestimmte Weise aus Rohdaten erstellt. Sollte ich es als statische Methode in Foo oder als eine andere separate Funktion setzen?
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))
Ich weiß nicht, ob es wichtiger ist, für Benutzer bequem zu sein:
foo1 = foo.makeFoo(sourceData)
oder ob es wichtiger ist, eine klare Kopplung zwischen der Methode und der Klasse aufrechtzuerhalten:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
Sie unter Bedeutung von @classmethod und @staticmethod für Anfänger.In Python bevorzuge ich normalerweise eine Klassenhierarchie gegenüber Factory-Methoden. So etwas wie:
Ich werde die gesamte Hierarchie (und nur diese) in ein Modul einfügen
foos.py
. Die BasisklasseFoo
implementiert normalerweise alle Methoden (und als solche die Schnittstelle) und wird normalerweise nicht direkt von den Benutzern erstellt. Die Unterklassen dienen dazu, den Basiskonstruktor zu überschreiben und anzugeben, wieFoo
er erstellt werden soll. Dann würde ich einen erstellen,Foo
indem ich den entsprechenden Konstruktor aufrufe, wie:Ich finde es eleganter und flexibler als Fabriken, die aus statischen Methoden, Klassenmethoden oder Funktionen auf Modulebene aufgebaut sind.
quelle