2010-08-16 13 views
11

Dostaję trochę bólu głowy próbując dowiedzieć się, jak organizować moduły i klasy razem. Pochodzę z C++, jestem przyzwyczajony do zajęć obejmujących wszystkie dane i metody wymagane do przetwarzania tych danych. W pythonie są jednak moduły, a z kodu, który oglądałem, niektórzy mają wiele funkcji przechowywanych w modułach, podczas gdy inni prawie zawsze wiążą swoje funkcje z klasami jako metodami.organizowanie klas i modułów w pytonie

Załóżmy na przykład, że mam strukturę danych i chciałbym zapisać ją na dysku.

Jednym ze sposobów byłoby zaimplementować metodę zapisywania dla tego obiektu tak, że mogę po prostu wpisać

MyObject.save(filename) 

lub coś podobnego. Inną metodą Widziałem w równych proporcjach jest mieć coś takiego

from myutils import readwrite 

readwrite.save(MyObject,filename) 

Jest to mały przykład, i nie jestem pewien, jak pyton specyficzny problem ten w ogóle, ale moje ogólne pytanie jest jaki jest najlepszy Praktyka pythonowa pod względem funkcji a organizacja metod?

Odpowiedz

13

Wygląda na to, że przeszkadzają ci luźne funkcje. To jest sposób python. Ma to sens, ponieważ moduł w Pythonie jest tak naprawdę tylko obiektem na tym samym poziomie, co każdy inny obiekt. Ma obsługę poziomu języka dla ładowania jej z pliku, ale poza tym jest tylko obiektem.

więc jeśli mam moduł foo.py:

import pprint 

def show(obj): 
    pprint(obj) 

Wtedy kiedy zaimportować go z bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

Ja w zasadzie dostępu do metody na obiekcie foo. Atrybuty danych modułu foo to tylko globale zdefiniowane w foo. Moduł jest implementacją pojedynczego poziomu języka bez potrzeby dodawania self do każdej listy argumentów metod.

Próbuję napisać jak najwięcej funkcji na poziomie modułu, jak to możliwe. Jeśli jakaś funkcja działa tylko z instancją danej klasy, uczynię ją metodą na klasie. W przeciwnym razie staram się, aby działała na instancjach każdej klasy zdefiniowanej w module, dla którego miałaby sens.

Racjonalnym uzasadnieniem podanego przez nas przykładu jest to, że jeśli każda klasa ma metodę zapisu, to jeśli później zmienisz sposób zapisywania danych (od systemu plików do bazy danych lub zdalnego pliku XML), musisz zmienić każdy klasa. Jeśli każda klasa implementuje interfejs, aby uzyskać dane, które chce zapisać, można napisać jedną funkcję, aby zapisać instancje każdej klasy i zmienić tę funkcję tylko raz. Jest to tak zwana zasada odpowiedzialności pojedynczej: każda klasa powinna mieć tylko jeden powód do zmiany.

3

Jeśli masz zwykłą starą klasę, którą chcesz zapisać na dysku, po prostu wykonam ją jako metodę instancji. Jeśli byłaby to biblioteka do serializacji, która poradziłaby sobie z różnymi typami obiektów, zrobiłbym to w drugą stronę.

+2

Termin "metoda klasy" brzmi jak "metoda klasy", która nie ma zastosowania. Odpowiednia rzecz będzie nazwana "metodą" lub "metodą instancji". –

+0

Tak, masz rację. Mam na myśli metodę instancji. –