Załóżmy, że mam plik foo.py
zawierający klasę Foo
:
class Foo(object):
def __init__(self, data):
...
Teraz chcę dodać funkcję, która tworzy Foo
obiekt w określony sposób z surowych danych źródłowych. Czy powinienem umieścić go jako metodę statyczną w Foo, czy jako inną osobną funkcję?
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))
Nie wiem, czy ważniejsza jest wygoda dla użytkowników:
foo1 = foo.makeFoo(sourceData)
lub czy ważniejsze jest zachowanie wyraźnego sprzężenia między metodą a klasą:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
, zobacz Znaczenie @classmethod i @staticmethod dla początkujących?W Pythonie zazwyczaj wolę hierarchię klas niż metody fabryczne. Coś jak:
Powiedzmy, że ustawię całą hierarchię (i tylko tę) w module
foos.py
. Klasa podstawowaFoo
zwykle implementuje wszystkie metody (i jako taki interfejs) i zwykle nie jest konstruowana bezpośrednio przez użytkowników. Podklasy to sposób na zastąpienie konstruktora podstawowego i określenie, jakFoo
ma zostać zbudowany. Następnie utworzę aFoo
, wywołując odpowiedni konstruktor, na przykład:Uważam, że jest bardziej elegancki i elastyczny niż fabryki zbudowane z metod statycznych, metod klasowych lub funkcji na poziomie modułu.
źródło