2012-07-26 19 views
5

Zadaję to pytanie w odniesieniu do Pythona, choć prawdopodobnie dotyczy to większości języków OOP.Tworzenie klasy Python dla "tylko jednej instancji"?

Kiedy spodziewam się używać modelu danych tylko raz w dowolnym programie, mogę utworzyć klasę z klasą/statycznymi metodami i atrybutami lub po prostu utworzyć zwykłą klasę i utworzyć instancję tylko raz i używać tylko tej jednej kopii. W takim przypadku, która metoda jest lepsza i dlaczego?

Z pytonem mogłem również napisać moduł i użyć go tak, jakbym zrobił klasę. W takim przypadku, który sposób jest lepszy i dlaczego?

Przykład: Chcę mieć centralną strukturę danych do uzyskiwania dostępu/zapisywania danych do plików.

Moduł sposób:

data.py

attributes = something 
... 
def save(): 
... 

main.py

import data 
data.x = something 
... 
data.save() 

Klasa sposób:

class Data: 
    attributes = something 
    @classmethod 
    def save(cls): 

Data.x = something 
Data.save() 

instancja sposób

class Data: 
    def save(self): 

data = Data() 
data.x = something 
data.save() 
+4

Dlaczego upadek? Jest to uzasadnione pytanie programistyczne. – darkfeline

+1

search stackoverflow dla 'singleton python' – warvariuc

+2

Zmienione pytanie jest znacznie lepsze. Nie sądzę, że bliskie (z wyjątkiem duplikatu) jest obecnie uzasadnione. –

Odpowiedz

5

Moduł służy do objęcia wspólnych struktur w "przestrzeni nazw". Ale tak naprawdę w Pythonie moduł jest po prostu plikiem i możesz je porządkować według własnego uznania. Niektórzy umieszczają dużą funkcjonalność w jednym module. Niektóre osoby rozkładają je na pakiety lub podpakiety. Zależy od możliwości ponownego użycia. Jeśli moduł ma ogromną liczbę zależności i będziesz chciał użyć go ponownie niewiele, warto je podzielić.

Klasa pozwala na zdefiniowanie typów, które można dziedziczyć jako podtypy. Pozwalają również zdefiniować stan każdej instancji tej klasy.

Kiedy twoja klasa nie ma stanów i tylko metody statyczne/metody klasowe, są szanse, że nie potrzebujesz klasy. Potrzebujesz tylko funkcji.

Ponadto nie można utworzyć modułu i używać go jak zajęć. Moduł nie może mieć podklas. Mają po prostu podstawowy moduł init po załadowaniu, a następnie zakres obiektów.

Jeśli to, na co się natkniesz, to stałe, co oznacza, że ​​są zdefiniowane raz dla życia aplikacji, a następnie po prostu stwórz moduł constants.py z grupą pierwotnych typów, takich jak łańcuchy, dyktatury i listy.

+1

Możesz użyć modułu podobnego do klasy (zobacz mój przykład), choć wydaje się trochę hackish. Szukam czegoś ze stanem i metodami, ale potrzebuję tylko jednej instancji, więc czy używam klasy lub instancji? – darkfeline

+0

Używasz tylko modułu dla jego zakresu. Poza tym, że jest obiektem modułu, nie jest jak klasa. Każdy obiekt może mieć atrybuty. – jdi

+0

Stan i metody sugerują czasami wzorzec Singleton. Chociaż niektórzy marszczą brwi na nich jako zły styl. Jeśli ma stan i konfigurację i wymaga określonej funkcjonalności, może być normalną klasą. Powinieneś unikać struktur, które aktywnie modyfikują globale. Stałe są zwykle czytane tylko jako – jdi

2

Standardowa implementacja modułu losowego ma dobry projekt, który pokazuje tworzenie i używanie instancji na poziomie modułów bez wymuszania pojedynczego wpisu na dowolnym użytkowniku.

Na przykład, jeśli zadzwonię pod numer random.random(), zostanie użyta ukryta instancja klasy Random, która została zainicjowana w czasie importu. Jeśli nie jestem usatysfakcjonowany wartością domyślną, mogę teraz wygenerować generator, który nie współużytkuje stanu z ukrytą instancją. Jeśli jesteś zainteresowany tym podejściem, przeczytaj random.py, który jest bardzo dobrze udokumentowany; istnieje tylko kilka istotnych linii kodu, które nie są tak trudne.

Takie podejście daje interesujący, sprytny akcent na singletons: skompiluj go automatycznie, ale nie przeszkadzaj mi w tworzeniu więcej, jeśli chcę.

Powiązane problemy