Czy w Pythonie lepiej jest zdefiniować moduł z funkcjami czy moduł z klasą zawierającą funkcje? [Zamknięte]

13

W moim kodzie jedna z powyższych dwóch opcji działałaby równie dobrze, ale jestem zainteresowany znalezieniem zalet i wad obu podejść.

TK100
źródło

Odpowiedzi:

9

To zależy od twoich potrzeb. Przez większość czasu moduł funkcji będzie tym, czego szukasz.

Klasy Python (imho) nie powinny być traktowane jak klasy w C #, C ++ lub Java, musi istnieć logiczny powód, aby zgrupować zestaw funkcji w większym obiekcie nadrzędnym, struktury danych byłyby dobrym tego przykładem, chcesz spójny zestaw funkcji, które odnoszą się bezpośrednio do klasy zamiast luźno zebranego zestawu funkcji ogólnego przeznaczenia.

  • Moduł funkcji: ogólnego przeznaczenia, użyteczności i więcej funkcji „globalnych”
  • Moduł klasy funkcji: pogrupowane klasy o podobnych potrzebach, różne typy danych z listy połączonej lub funkcje przetwarzania dźwięku lub różne typy drzew.

Moduł jest przeznaczony do ogólnego zhierarchizowanego grupowania podobnych systemów, zazwyczaj wszystkie funkcje narzędziowe mam pod jednym modułem, wszystkie dane pod innym, moja warstwa danych i złącza pod modułem bardziej „nadrzędnym”. Ponieważ moduł jest tylko grupowaniem mentalnym, mniej chodzi o to, jakie typy systemów są w nim (klasy lub funkcje, szczerze mówiąc prawdopodobnie połączenie tych dwóch), a więcej o logiczne połączenia między systemami w module.

Jeff Langemeier
źródło
7
Nie rozumiem kontrastu między klasą Python a innymi językami. W jakim języku miałbyś klasę z funkcjami, które nie mają logicznego powodu do grupowania?
Guy Sirton
7

Podstawowe pytanie dotyczy tego, czy potrzebujesz różnych instancji swojego modułu / klasy. moduł python jest jak singleton - zawsze odwołujesz się do tego samego obiektu, tzn. jeśli potrzebujesz instancji, potrzebujesz klasy.

Jeśli jednak nie potrzebujesz instancji, być może nadal będziesz musiał ustawić swój „obiekt” do stanu początkowego. chociaż jest to wyraźnie możliwe w przypadku zwykłego modułu, jeśli inicjowanie jest bardziej skomplikowane niż tylko ustawianie niektórych wartości, radziłbym mieć kod inicjujący w __init__metodzie klasy zapewniającej czytelność.

kr1
źródło
2
warto zauważyć, że prawdopodobnie mówisz o czymś, co ma stan, np. moduł ze zmiennymi globalnymi vs. klasa ze zmiennymi składowymi. jeśli twoja klasa ma tylko metody, ale nie ma stanu, nie ma powodu, by mieć wiele instancji
thbusch 26.01.2013
3
@thbusch, tak, jest to sugerowane potrzebą wystąpienia .
kr1
Kiedy mówiłeś o potrzebie wystąpienia instancji, która pozwoliła mi zrozumieć moduł vs klasa. Na przykład, gdybym musiał tworzyć wiele samochodów, klasa byłaby odpowiednia w porównaniu z modułem kalkulatora, w którym nie muszę tworzyć wielu kalkulatorów, wystarczy użyć metod dodawania i odejmowania od tego modułu.
tazboy