2009-11-26 8 views
37

Ich komme aus einem Hintergrund, wo ich normalerweise eine Datei pro Klasse erstellen. Ich organisiere gemeinsame Klassen auch unter Verzeichnissen. Diese Praxis ist für mich intuitiv und hat sich in C++, PHP, JavaSript usw. bewährt.Die Pythonic Art der Organisation von Modulen und Paketen

Ich habe Probleme, diese Metapher in Python zu bringen: Dateien sind nicht mehr nur Dateien, sondern formale Module. Es scheint nicht richtig zu sein, nur eine Klasse in einem Modul zu haben - die meisten Klassen sind für sich selbst nutzlos. Wenn ich eine automobile.py und eine Automobile Klasse habe, scheint es albern, es immer als automobile.Automobile als auch zu verweisen.

Aber zur gleichen Zeit scheint es nicht richtig, eine Tonne Code in eine Datei zu werfen und es einen Tag zu nennen. Offensichtlich sollte eine sehr komplexe Anwendung mehr als 5 Dateien haben.

Was ist der richtige --- oder Python - --- Weg? (Oder wenn es keinen richtigen Weg gibt, was ist dein bevorzugter Weg und warum?) Wie viel Code sollte ich in ein Python-Modul werfen?

+0

Duplizieren: http://stackoverflow.com/questions/1642975/folder-and-file-organization-for-python-develement –

+1

Duplizieren: http://stackoverflow.com/questions/106896/how-many-python -klassen-sollte-i-put-in-one-datei –

Antwort

31

Denken Sie in Bezug auf eine "logische Einheit der Verpackung" - die eine einzelne Klasse sein kann, aber häufiger wird eine Reihe von Klassen, die eng zusammenarbeiten. Klassen (oder Funktionen auf Modulebene - machen Sie "Java in Python" nicht, indem Sie immer statische Methoden verwenden, wenn auch Funktionen auf Modulebene verfügbar sind! -) können basierend auf diesem Kriterium gruppiert werden. Wenn die meisten Benutzer von A auch B benötigen und umgekehrt, sollten sich A und B wahrscheinlich im selben Modul befinden. aber wenn viele Benutzer nur einen von ihnen benötigen und nicht den anderen, dann sollten sie wahrscheinlich in verschiedenen Modulen sein (vielleicht in demselben Paket, d. h. Verzeichnis mit einer __init__.py Datei darin).

Die Python-Standardbibliothek ist zwar alles andere als perfekt, neigt jedoch dazu, (meist) einigermaßen gute Praktiken zu widerspiegeln - so können Sie meistens mit gutem Beispiel daraus lernen. ZB das threading Modul definiert natürlich eine Thread Klasse ... aber es enthält auch die Synchronisation-primitive Klassen wie Sperren, Ereignisse, Bedingungen und Semaphore und eine Exception-Klasse, die durch Threading-Operationen (und einige mehr Dinge).Es liegt an der oberen Grenze einer vernünftigen Größe (800 Zeilen einschließlich Leerraum und Docstrings), und einige wichtige Thread-bezogene Funktionen wie Warteschlange wurde in einem separaten Modul platziert, dennoch ist es ein gutes Beispiel dafür, wie viel Funktionalität es noch immer sinnvoll macht in ein einzelnes Modul zu packen.

7

sehen Wenn Sie Ihr One-Klasse-per-Dateisystem halten wollen (was logisch, versteh mich nicht falsch), könnte man so etwas tun zu vermeiden automobile.Automobile beziehen zu müssen:

from automobile import Automobile 
car = Automobile() 

wie jedoch cobbal erwähnt, mehr als eine Klasse pro Datei in Python ziemlich üblich ist. Wie auch immer, solange Sie ein vernünftiges System auswählen und es konsequent verwenden, glaube ich nicht, dass irgendwelche Python-Benutzer auf Sie wütend werden.

4

In einem mittelgroßen Projekt fand ich mich mit mehreren eng verwandten Klassen zusammen. Mehrere dieser Sets sind jetzt in Dateien gruppiert. Zum Beispiel sind die untergeordneten Netzwerkklassen alle in einem einzigen network Modul. Einige der größten Klassen wurden jedoch in eine eigene Datei aufgeteilt.

Der beste Weg, um diesen Pfad aus einem Ein-Klassen-pro-Datei-Verlauf zu starten, besteht darin, die Klassen, die Sie normalerweise im selben Verzeichnis speichern würden, stattdessen in derselben Datei zu speichern. Wenn die Datei zu groß aussieht, teilen Sie sie auf.

8

Wenn Sie aus der Sicht von C++ kommen, könnten Sie Python-Module anzeigen, die einer .so- oder .dll-Datei ähneln. Ja, sie sehen aus wie Quelldateien, weil Python Skripte enthält, aber sie sind tatsächlich ladbare Bibliotheken mit spezifischen Funktionen.

Eine andere Metapher, die helfen könnte, ist, dass Sie Python-Module als Namespaces aussehen könnten.

Verwandte Themen