Frage

Ich komme aus einem Hintergrund, in dem ich normalerweise eine Datei pro Klasse erstelle. Ich organisiere auch gemeinsame Klassen unter Verzeichnissen. Diese Praxis ist mir intuitiv und hat sich in C ++, PHP, Javasript usw. wirksam erwiesen.

Ich habe Probleme, diese Metapher in Python zu bringen: Dateien sind nicht mehr nur Dateien, sondern sie sind formelle 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 habe automobile.py und ein Automobile Klasse, es scheint albern, immer darauf zu verweisen als automobile.Automobile auch.

Gleichzeitig scheint es nicht richtig zu sein, eine Menge 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 pythonische Weg? (Oder wenn es keinen richtigen Weg gibt, wie viel ist Ihr bevorzugter Weg und warum?) Wie viel Code sollte ich ein Python -Modul einwerfen?

War es hilfreich?

Lösung

Denken Sie an eine "logische Einheit der Verpackung", die möglicherweise eine einzelne Klasse ist, aber häufiger wird eine Reihe von Klassen sein, die eng zusammenarbeiten. Klassen (oder Funktionen auf Modulebene-"Machen Sie Java in Python nicht", indem Sie immer statische Methoden verwenden, wenn Funktionen auf Modulebene ebenfalls als Wahl verfügbar sind!-) basierend auf diesem Kriterium gruppiert werden. Grundsätzlich sollten A und B wahrscheinlich im selben Modul sein. Aber wenn viele Benutzer nur einen von ihnen und nicht den anderen brauchen, sollten sie wahrscheinlich in unterschiedlichen Modulen sein (vielleicht im selben Paket, dh Verzeichnis mit einem __init__.py Datei darin).

Die Standard -Python -Bibliothek spiegelt zwar weit davon entfernt, (meistens) einigermaßen gute Praktiken widerzuspiegeln - sodass Sie meistens mit gutem Beispiel vorangehen können. ZB, der threading Modul definiert natürlich a Thread Klasse ... aber auch die synchronisierungsprimitischen Klassen wie Schlösser, Ereignisse, Bedingungen und Semaphoren sowie eine Ausnahmeklasse, die durch Threading-Operationen (und einige weitere Dinge) angehoben werden kann. Es befindet sich an der oberen Grenze einer vernünftigen Größe (800 Zeilen einschließlich Weißespace und Docstrings), und einige entscheidende fadenbezogene Funktionen wie Warteschlangen wurden in ein separates Modul platziert. Es ist jedoch ein gutes Beispiel dafür in ein einzelnes Modul packen.

Andere Tipps

Wenn Sie sich an Ihr Ein-Klassen-per-Datei-System halten möchten (was logisch ist, stellen Sie mich nicht falsch), können Sie so etwas tun, um es vermeiden zu müssen, sich darauf zu beziehen automobile.Automobile:

from automobile import Automobile
car = Automobile()

Wie von Cobbal erwähnt, ist in Python mehr als eine Klasse pro Datei ziemlich häufig. Soweit Sie ein vernünftiges System auswählen und es konsequent verwenden, glaube ich nicht, dass Python -Benutzer sauer auf Sie werden :).

Wenn Sie aus C ++ - Sicht kommen, können Sie Python -Module anzeigen, die einem. So oder .dll ähneln. Ja, sie sehen aus wie Quelldateien, weil Python geschrieben ist, aber sie sind tatsächlich ladbare Bibliotheken mit spezifischer Funktionalität.

Eine weitere Metapher, die helfen kann, ist, dass Sie möglicherweise Python -Module als Namespaces betrachten.

In einem mittelgroßen Projekt befand ich mich mit mehreren Sätzen eng verwandter Klassen. Einige dieser Sets sind jetzt in Dateien zusammengefasst. Zum Beispiel sind die Netzwerkklassen auf niedriger Ebene alle in einer einzigen network Modul. Einige der größten Klassen wurden jedoch in ihre eigene Datei aufgeteilt.

Vielleicht ist der beste Weg, diesen Weg aus einer Ein-Klassen-per-Datei-Geschichte zu beginnen, die Klassen, die Sie normalerweise in demselben Verzeichnis platzieren, in derselben Datei zu halten. Wenn diese Datei zu groß aussieht, teilen Sie sie auf.

Als vage Richtlinie: Mehr als 1 Klasse pro Datei ist die Norm für Python

siehe auch Wie viele Pythonklassen sollte ich in eine Datei einfügen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top