2010-10-01 12 views
53

Podobna mi jest konwencja Javy, która ma jedną klasę publiczną na plik, nawet jeśli czasami istnieją dobre powody, aby umieścić więcej niż jedną klasę publiczną w jednym pliku. W moim przypadku mam alternatywne implementacje tego samego interfejsu. Ale jeśli chciałbym umieścić je w oddzielnych plikach, musiałbym nadmiarowych nazw w sprawozdaniu importowych (lub mylące nazwy modułu):Porządkowanie klas Pythona w modułach i/lub pakietach

import someConverter.SomeConverter 

natomiast someConverter byłyby plik (moduł) imię i nazwisko klasa SomeConverter . Wygląda to dla mnie bardzo nieelegancko. Aby umieścić wszystkie alternatywne zajęcia w jednym pliku doprowadziłoby do bardziej znaczącej instrukcji import:

import converters.SomeConverter 

Obawiam się jednak, że pliki stają się dość duża, jeśli mogę umieścić wszystkie pokrewne zajęcia w jednym pliku modułu. Jaka jest tutaj najlepsza praktyka Pythona? Czy jedna klasa na plik jest nietypowa?

+7

Kiedy masz do czynienia z projektem obejmującej 10'000 zajęć, będziesz szczęśliwy, jeśli można znaleźć klasę (publiczne) przez swojego pliku (nazwa pakietu) zamiast konieczności przeszukiwania zawartości pliku ll files. to prawdopodobnie powód, dla którego Java wymusza, że ​​istnieje tylko jedna klasa publiczna na plik i że nazwa pliku musi być nazwą klasy. –

Odpowiedz

55

Wiele z nich to osobiste preferencje. Korzystanie z modułów Pythona, masz możliwość utrzymania każdej klasy w osobnym pliku i nadal pozwalają na import converters.SomeConverter (lub from converters import SomeConverter)

strukturę pliku może wyglądać mniej więcej tak:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

a potem w swojej __init__.py file:

from baseconverter import BaseConverter 
from otherconverter import OtherConverter 
36

Zach przerwy rozwiązaniem na Pythonie 3. Tu jest stałym rozwiązaniem.

Wiele z nich to osobiste preferencje. Korzystanie z modułów Pythona, masz możliwość utrzymania każdej klasy w osobnym pliku i nadal pozwalają na import converters.SomeConverter (lub from converters import SomeConverter)

strukturę pliku może wyglądać mniej więcej tak:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

a potem w swojej __init__.py file:

from converters.baseconverter import BaseConverter 
from converters.otherconverter import OtherConverter 
+1

Co powiecie na "z .baseconverter import BaseConverter"? –

+0

Przepraszam za późną obserwację, ostatnio nie miałem kontaktu z pytonem, jeśli ktoś może zweryfikować powyższe rozwiązanie Michaela, proszę, edytuj moją odpowiedź i dodaj to jako alternatywę. (Nie zmieniaj mojego oryginału, ponieważ myślę, że to kwestia preferencji co do tego, który z nich wygląda na bardziej czytelny, więc dajmy użytkownikom obie opcje). – Spundun

+6

Odpowiedź Michaela działa, ale PEP 8 zniechęca do względnego importu. http://stackoverflow.com/questions/4209641/absolute-vs-explicit-relative-import-of-python-module –

Powiązane problemy