Frage

In meiner Anwendung hat ich einige globalen Anwendungszustand und weltweite Anwendung breite Methoden wie aktuell verbundene Benutzer zu erhalten, die Gesamtzahl der Antworten, erstellen Sie eine Anwendung Konfigurationsdatei usw. Es gibt zwei Möglichkeiten:

  1. Erstellen Sie eine separate appstate.py Datei mit globalen Variablen mit Funktionen über sie. Es sieht zunächst in Ordnung, aber es scheint, dass ich fehle etwas in Klarheit meines Codes.

  2. Erstellen Sie eine Klasse AppState mit Klasse-Funktionen in einer appstate.py Datei, alle anderen Module wurden von ihren spezifischen Jobs definiert. Das sieht gut aus. Aber jetzt muss ich länger Linie wie appstate.AppState.get_user_list () schreiben. Darüber hinaus sind die Verfahren nicht so viel miteinander verwandt. Ich kann verschiedene Klassen erstellen, aber das wäre zu viele Klassen.

EDIT: Wenn ich Klassen verwende ich sein Class verwenden. Ich glaube nicht, dass es notwendig ist, um die Klasse zu einem Objekt zu instanziiert.

War es hilfreich?

Lösung

Der zweite Ansatz scheint besser. Ich würde die erste verwenden nur für Konfigurationsdateien oder so etwas.

Wie auch immer, um zu verhindern, das Problem konnte man immer:

from myapp.appstate import AppState

Auf diese Weise müssen Sie nicht mehr die lange Linie schreiben.

Andere Tipps

Klingt wie das klassische Rätsel: -).

In Python gibt es nichts schmutzig oder beschämend über die Wahl eines Moduls zu verwenden, wenn dies der beste Ansatz ist. Schließlich, Module, Funktionen und dergleichen sind in der Tat, Bürger erster Klasse in der Sprache und bieten Selbstbeobachtung und Eigenschaften, die viele andere Programmiersprachen nur von Objekten durch die Verwendung bieten.

Die Art und Weise Sie Ihre Optionen beschrieben haben, es klingt ein bisschen wie Sie über einen klassenbasierten Ansatz in diesem Fall nicht zu verrückt sind.

Ich weiß nicht, ob Sie die Django-Framework verwendet habe, aber wenn nicht, haben einen Blick auf die Dokumentation, wie sie Einstellungen handhaben. Dies sind App weit sie definiert sind in einem Modul, und sie sind weltweit verfügbar. So wie es die Optionen analysiert und setzen sie global ist sehr elegant, und Sie können einen solchen Ansatz für Ihre Bedürfnisse inspirierende finden.

Der zweite Ansatz ist nur signifikant verschieden von dem ersten Ansatz, wenn Sie Anwendungszustand in einer Instanz gespeichert haben von AppState, wobei in diesem Fall Ihre Beschwerde keine Anwendung findet. Wenn Sie nur Sachen in einer Klasse zu speichern und mit statischen / Klassenmethoden, die Klasse ist nicht anders als ein Modul, und es wäre pythonic stattdessen tatsächlich als Modul hat.

Warum nicht mit einer Instanz dieser Klasse? Auf diese Weise können sogar in der Lage sein könnte später auf 2 verschiedenen „Sitzungen“ zu laufen haben, je nachdem, welche Instanz Sie verwenden. Es könnte machen es flexibler. Vielleicht eine Methode get_appstate() den Modul hinzufügen, damit es die Klasse einmal instanciates. Später, wenn Sie mehrere Instanzen wollen vielleicht können Sie diese Methode ändern, um schließlich einen Parameter zu nehmen und einige Lexikon nutzen usw. die entsprechenden Instanzen zu speichern.

Sie können auch Immobilien Dekorateure benutzen btw Dinge besser lesbar und haben die Flexibilität, um die Speicherung es, wie und wo Sie es speichern wollen.

Ich bin damit einverstanden, dass es mehr pythonic wäre den Modul Ansatz statt Class zu verwenden.

BTW, ich bin nicht so ein großer Fan von von einigen „Magie“ global verfügbar Dinge haben. Ich würde lieber etwas expliziten Aufruf verwenden, um diese Informationen zu erhalten. Dann weiß ich, wo die Dinge kommen und wie es zu debuggen, wenn die Dinge nicht.

Betrachten Sie dieses Beispiel:

configuration
|
+-> graphics
|   |
|   +-> 3D
|   |
|   +-> 2D
|
+-> sound

Die eigentliche Frage ist: Was ist der Unterschied zwischen den Klassen und Module in dieser Hierarchie ist, da sie von beiden Mitteln dargestellt werden könnten

Klassen repräsentieren Typen. Wenn Sie Ihre Lösung mit Klassen statt Module implementieren, können Sie ein Grafikobjekt überprüfen es richtige Art ist, aber generische Grafikfunktionen schreiben.

Mit Klassen können Sie parametrisierte Werte generieren. Dadurch ist es möglich, unterschiedlich das Sounds Klasse mit einem Konstruktor zu initialisieren, aber es ist schwer, ein Modul mit unterschiedlichen Parametern zu initialisieren.

Der Punkt ist, dass man wirklich etwas anderes aus der Modellierung Standpunkt aus.

würde ich mit den Klassen Weg gehen, wie es besser Ihren Code organisieren. Denken Sie daran, dass für die Lesbarkeit Sie können dies tun:

from appstate import AppSate

Ich würde auf jeden Fall für die zweite Option gehen: verwendet bereits die erste, ich bin jetzt Refactoring gezwungen, wie meine Anwendung entwickelt und müssen mehr modulare Konstrukte unterstützen, also muss ich jetzt mehrere simultanen Konfigurationen zu handhaben ‘.

Der zweite Ansatz ist, IMO, flexibler und zukunftssicher. Um die längeren Codezeilen zu vermeiden, Sie from appstate import AppState statt nur import appstate nutzen könnten.

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