Wird es in Python als besser angesehen, ein Modul mit Funktionen oder ein Modul mit einer Klasse zu definieren, die Funktionen enthält? [geschlossen]

12

In meinem Code würde eine der beiden oben genannten Optionen gleich gut funktionieren, aber ich bin daran interessiert, die Vor- und Nachteile beider Ansätze herauszufinden.

TK100
quelle

Antworten:

9

Es hängt ganz ehrlich von Ihren Bedürfnissen ab. Meistens ist ein Funktionsmodul das, wonach Sie suchen.

Python-Klassen (imho) sollten nicht wie Klassen in C # oder C ++ oder Java gedacht werden. Es muss einen logischen Grund geben, eine Reihe von Funktionen in einer größeren übergeordneten Klasse zu gruppieren. Datenstrukturen wären ein gutes Beispiel dafür Eine kongruente Menge von Funktionen, die direkt auf die Klasse angewendet werden, anstelle einer lose gesammelten Menge von Funktionen, die für allgemeine Zwecke bestimmt sind.

  • Funktionsmodul: Allzweck-, Dienstprogramm- und weitere "globale" Funktionen
  • Modul der Funktionsklasse: Gruppierte Klassen mit ähnlichen Anforderungen, verschiedene verknüpfte Listendatentypen oder Audioverarbeitungsfunktionen oder verschiedene Baumtypen.

Ein Modul ist für die gesamte hierarchische Gruppierung ähnlicher Systeme vorgesehen. Normalerweise habe ich alle Dienstprogrammfunktionen unter einem einzigen Modul, alle Daten unter einem anderen, meine Datenschicht und Konnektoren unter einem eher "übergeordneten" Modul. Da ein Modul nur eine mentale Gruppierung ist, geht es weniger darum, welche Arten von Systemen sich darin befinden (Klassen oder Funktionen, ehrlich gesagt wahrscheinlich eine Mischung aus beiden), sondern vielmehr um die logischen Verbindungen zwischen den Systemen unter dem Modul.

Jeff Langemeier
quelle
5
Ich verstehe den Kontrast zwischen einer Python-Klasse und anderen Sprachen nicht. In welcher Sprache hätten Sie eine Klasse mit Funktionen, die keinen logischen Grund für eine Gruppierung haben?
Guy Sirton
7

Die grundlegende Frage ist, ob Sie unterschiedliche Instanzen Ihres Moduls / Ihrer Klasse benötigen . Ein Python-Modul ist wie ein Singleton - Sie verweisen immer auf dasselbe Objekt, dh wenn Sie Instanzen benötigen, benötigen Sie eine Klasse.

Wenn Sie jedoch keine Instanzen benötigen, müssen Sie Ihr "Objekt" möglicherweise noch auf einen Anfangszustand einstellen. Während dies mit einem einfachen Modul eindeutig möglich ist, würde ich empfehlen, Code __init__zur besseren Lesbarkeit in der Methode einer Klasse zu initialisieren, wenn die Initialisierung komplexer ist als das Festlegen einiger Werte .

kr1
quelle
2
Es könnte sich lohnen, darauf hinzuweisen, dass Sie wahrscheinlich über etwas mit Status sprechen, z. B. ein Modul mit globalen Variablen gegen eine Klasse mit Mitgliedsvariablen. Wenn Ihre Klasse nur Methoden, aber keinen Status hat, gibt es wenig Grund, mehrere Instanzen zu haben
thbusch
2
@ thbusch, ja, das ist impliziert , wenn Instanzen benötigt werden .
kr1
Als Sie über die Notwendigkeit einer Instanz sprachen, die mir das Verständnis von Modul gegen Klasse ermöglichte. Wenn ich beispielsweise mehrere Autos bauen müsste, wäre eine Klasse für ein Rechnermodul geeignet, in dem ich keine Taschenrechner erstellen muss. Ich muss nur die Additions- und Subtraktionsmethoden für dieses Modul verwenden.
Tazboy