Ich möchte Methoden in einer Python-Klasse bestellen, weiß aber nicht, welche Reihenfolge richtig ist.
Wenn ich Methoden in Eclipse mit PyDev extrahiere, setzt Eclipse die extrahierte Methode über die geänderte Methode. Dies setzt jedoch die Details der unteren Ebene vor die Details der höheren Ebene. Laut Onkel Bob sollte ich das Gegenteil tun, damit mein Code wie die Schlagzeilen einer Zeitung liest. Wenn ich Java programmiere, folge ich einfach seinem Rat.
Was ist die beste Vorgehensweise für Python?
Antworten:
Wie andere bereits betont haben, gibt es keinen richtigen Weg, um Ihre Methoden zu bestellen. Vielleicht wäre ein PEP-Vorschlag nützlich, aber trotzdem. Lassen Sie mich versuchen, Ihre Frage so objektiv wie möglich anzugehen.
Schnittstellen zuerst: Öffentliche Methoden und Python Magic-Funktionen definieren die Schnittstelle der Klasse. In den meisten Fällen möchten Sie und andere Entwickler eine Klasse verwenden, anstatt sie zu ändern. Daher werden sie an der Schnittstelle dieser Klasse interessiert sein. Wenn Sie es zuerst in den Quellcode einfügen, wird vermieden, dass Sie durch Implementierungsdetails scrollen, die Sie nicht interessieren.
Eigenschaften, magische Methoden , öffentliche Methoden: Es ist schwierig, die beste Reihenfolge zwischen diesen drei zu definieren, die alle Teil der Schnittstelle der Klasse sind. Wie @EthanFurman sagt, ist es am wichtigsten, für das gesamte Projekt bei einem System zu bleiben. Im Allgemeinen erwarten
__init__()
die Leute die beste erste Funktion in der Klasse, daher folge ich den anderen magischen Methoden direkt unten.Lesereihenfolge: Grundsätzlich gibt es zwei Möglichkeiten, eine Geschichte zu erzählen: Bottom-up oder Top-down. Wenn Funktionen auf hoher Ebene an erster Stelle stehen, kann ein Entwickler durch Lesen der ersten Zeilen ein grobes Verständnis der Klasse erlangen. Andernfalls müsste man die gesamte Klasse lesen, um die Klasse zu verstehen, und die meisten Entwickler haben dafür keine Zeit. Als Faustregel sollten Sie Methoden über alle Methoden stellen, die von ihrem Körper aufgerufen werden.
Klassenmethoden und statische Methoden: Normalerweise wird dies durch die oben erläuterte Lesereihenfolge impliziert . Normale Methoden können alle Methoden mal aufrufen und stehen daher an erster Stelle. Klassenmethoden können nur Klassenmethoden und statische Methoden aufrufen und kommen als nächstes. Statische Methoden können keine anderen Methoden der Klasse aufrufen und stehen an letzter Stelle.
Hoffe das hilft. Die meisten dieser Regeln sind übrigens nicht Python-spezifisch. Mir ist keine Sprache bekannt, die die Reihenfolge der Methoden erzwingt, aber wenn ja, wäre dies sehr interessant und bitte kommentieren Sie.
quelle
__init__
explizit (in Kombination mit__new__
) oder implizit (über den Standardkonstruktor) auf, sodass dies ein Grund wäre, sie zusammenzustellen__init__
. (Obwohl ich noch nie gesehen habe sie gestellt vor__init__
.)Es gibt keine richtige Reihenfolge. Wählen Sie ein System und bleiben Sie dabei. Die, die ich benutze, ist:
class SomeClass(object): def __magic_methods__(self): "magic methods first, usually in alphabetical order" def _private_method(self): "worker methods next, also in alpha order" def a_method(self): "then normal methods, also in alpha order"
quelle
@staticmethod
,@classmethod
,@property
und alle andere@decorator
Linien , damit ich die Art der Methode verwenden , um festzustellen , wo es (mit der Ausnahme , dass Eigenschaften zwischen gehen neigen geht_private_methods
undnormal_methods
).@classmethod
s next (@classmethod def a_class_method(cls)
) dann@staticmethod
s (@staticmethod def a_static_method()
) kommt? Zumindest ist das die Richtlinie, wie ich sie verstehe ... (ohne dass meine IDE irgendetwas faltet, weil mir das nicht gefällt)Ich mache etwas Ähnliches wie @Ethan, das ich in Djangos Quelle gesehen habe, wo der Hauptunterschied große "############" Blockkommentare sind, um die Bereiche abzugrenzen. Zum Beispiel,
class SomeClass(object): ################# # Magic Methods # ################# def __magic_methods__(self): "magic methods first" ################## # Public Methods # ################## def a_method(self): "then normal methods, in order of importance" ################### # Private Methods # ################### def _private_method(self): "then worker methods, grouped by importance or related function"
Offensichtlich ist dies für kleinere Klassen weniger nützlich.
quelle
####
Blöcke zu entfernen , als mir klar wurde, dass Sie sie absichtlich dort platzieren würden! Ich stimme jedoch der Reihenfolge zu , um die es in dieser Frage geht. Ich würde empfehlen, das####
aus diesem Beispiel zu entfernen, da es sich nicht auf den Umfang der Frage bezieht und Ihr Beispiel von einer kleinen Klasse ist, für die Sie####
sowieso nichts verwenden würden. :-)