it-swarm.com.de

Wird es als pythonisch angesehen, mehrere Klassen in derselben Datei zu definieren?

Bei der ersten Arbeit mit python) habe ich festgestellt, dass ich am Ende mehrere Klassen in derselben Datei schreibe, im Gegensatz zu anderen Sprachen wie Java, die eine Datei pro Klasse verwenden.

Normalerweise bestehen diese Klassen aus 1 abstrakten Basisklasse mit 1-2 konkreten Implementierungen, deren Verwendung geringfügig variiert. Ich habe eine solche Datei unten gepostet:

class Logger(object):

    def __init__(self, path, fileName):
        self.logFile = open(path + '/' + filename, 'w+')
        self.logFile.seek(0, 2)

    def log(self, stringtoLog):
        self.logFile.write(stringToLog)

    def __del__(self):
        self.logFile.close()

class TestLogger(Logger):   

    def __init__(self, serialNumber):
        Logger.__init__('/tests/ModuleName', serialNumber):

    def readStatusLine(self):
        self.logFile.seek(0,0)
        statusLine = self.logFile.readLine()
        self.logFile.seek(0,2)
        return StatusLine

    def modifyStatusLine(self, newStatusLine):
        self.logFile.seek(0,0)
        self.logFile.write(newStatusLine)
        self.logFile.seek(0,2)

class GenericLogger(Logger):

    def __init__(self, fileName):
        Logger.__init__('/tests/GPIO', fileName):

    def logGPIOError(self, errorCode):
        self.logFile.write(str(errorCode))

Wie oben gezeigt, habe ich eine Logger-Basisklasse mit einigen Implementierungsunterschieden darunter.

Die Frage : Ist dieser Standard für Python oder für irgendeine Sprache? Welche Probleme können bei der Verwendung dieser Implementierung auftreten, wenn überhaupt?

EDIT : Ich suche nicht wirklich nach Anleitungen für diese spezifische Datei, aber im allgemeineren Sinne. Was wäre, wenn die Klassen 3-5 mäßig komplexe Methoden wären? Wäre es dann sinnvoll, sie aufzuteilen? Wo ist der Cutoff für die Aussage, dass Sie eine Datei aufteilen sollten?

32
Ampt

Das ist gut. Als Referenz ist es auch in C++ in Ordnung.

Eng gekoppelte Dinge zusammenzuhalten ist eine vernünftige Praxis. Das Vermeiden einer unangemessenen Kopplung ist ebenfalls eine gute Praxis. Das richtige Gleichgewicht zu finden, ist keine Frage strenger Regeln, sondern ein Gleichgewicht zwischen verschiedenen Anliegen.

Einige Faustregeln:

  1. Größe

    Zu große Dateien können hässlich sein, aber das ist hier kaum der Fall. Hässlichkeit ist wahrscheinlich ein guter Grund, eine Datei zu teilen, aber die Entwicklung dieses ästhetischen Sinns ist größtenteils eine Frage der Erfahrung, sodass Sie nicht herausfinden können, was zu tun ist a priori

  2. Trennung von Bedenken

    Wenn Ihre konkreten Implementierungen sehr unterschiedliche interne Probleme haben, sammelt Ihre einzelne Datei all diese Probleme. Bei Implementierungen mit nicht überlappenden Abhängigkeiten hängt Ihre einzelne Datei beispielsweise von der Vereinigung all dieser Abhängigkeiten ab.

    Daher kann es manchmal sinnvoll sein, zu berücksichtigen, dass die Kopplung der Unterklassen an ihre Abhängigkeiten die Kopplung an die Schnittstelle überwiegt (oder umgekehrt, dass die Bedenken von Implementierung einer Schnittstelle schwächer sind als die Bedenken innerhalb dieser Implementierung ).

    Nehmen Sie als konkretes Beispiel eine generische Datenbankschnittstelle. Konkrete Implementierungen, die eine In-Memory-Datenbank, ein SQL-RDBMS bzw. eine Webabfrage verwenden, haben außer der Schnittstelle möglicherweise nichts gemeinsam, und es ist unangenehm, alle zu zwingen, die möchten, dass die kompakte In-Memory-Version auch eine SQL-Bibliothek importiert.

  3. Verkapselung

    Obwohl Sie können gut gekapselte Klassen in dasselbe Modul schreiben, könnten unnötige Kopplungen fördern, nur weil Sie Zugriff auf Implementierungsdetails haben, die sonst nicht außerhalb des Moduls exportiert würden .

    Ich denke, das ist nur ein schlechter Stil, aber Sie könnten eine bessere Disziplin durch Aufteilen des Moduls erzwingen, wenn Sie die Gewohnheit wirklich nicht brechen können.

27
Useless

Meine üblichen Referenzdokumente, um zu wissen, was Pythonic ist.

Einfach ist besser als komplex.

Wohnung ist besser als verschachtelt.

Von Das Zen von Python

Klassennamen verwenden fast ausnahmslos die CapWords-Konvention.

Paket- und Modulnamen Module sollten kurze Namen in Kleinbuchstaben haben. [...] Modulnamen werden Dateinamen zugeordnet

Von PEP 8

Meine Interpretation ist, dass es in Ordnung ist, da es die Dinge einfach und flach halten würde. Da Klassennamen und Dateinamen unterschiedliche Fälle haben, sollten sie sowieso nicht identisch sein, sodass ich kein Problem beim Packen mehrerer verwandter Klassen in eine Datei sehen würde.

7
SylvainD

Was Sie jetzt haben, ist in Ordnung. Durchsuchen Sie die Standardbibliothek - es gibt viele Module mit mehreren verwandten Klassen in einer einzigen Datei. Irgendwann werden die Dinge größer und Sie werden möglicherweise anfangen wollen, Module mit mehreren Dateien zu verwenden, aber es gibt keine wirklichen Regeln, wann. Die Dinge werden nur geteilt, wenn sich eine Datei "zu groß" anfühlt.

1

Es ist definitiv in Ordnung und ich würde Sie ermutigen, mehrere Klassen in einer Datei zu haben, solange sie realisiert sind. Im Allgemeinen sollten Ihre Klassen kurz und prägnant bleiben und Sie sollten das Verhalten lieber in zwei oder mehr Klassen aufteilen, als große monolithische Klassen aufzubauen. Wenn Sie mehrere kleine Klassen schreiben, ist es wirklich notwendig und hilfreich, diejenigen, die in Beziehung stehen, in derselben Datei zu belassen.

0
wirrbel