Weiteres Echo von Mike und Alex Ratschläge von und Hinzufügen meiner eigenen Farbe ...
Die Verwendung von Instanzattributen ist das typische ... das idiomatischere Python. Klassenattribute werden nicht so häufig verwendet, da ihre Anwendungsfälle spezifisch sind. Gleiches gilt für statische und Klassenmethoden im Vergleich zu "normalen" Methoden. Es handelt sich um spezielle Konstrukte, die sich mit bestimmten Anwendungsfällen befassen. Andernfalls handelt es sich um Code, der von einem abweichenden Programmierer erstellt wurde, der zeigen möchte, dass er eine dunkle Ecke der Python-Programmierung kennt.
Alex erwähnt in seiner Antwort, dass der Zugriff aufgrund einer geringeren Nachschlageebene (ein wenig) schneller sein wird. Lassen Sie mich diejenigen näher erläutern, die noch nicht wissen, wie dies funktioniert. Es ist dem variablen Zugriff sehr ähnlich - die Suchreihenfolge lautet:
- Einheimische
- Nichtlokale
- Globale
- eingebaute
Für den Attributzugriff lautet die Reihenfolge:
- Beispiel
- Klasse
- Basisklassen gemäß MRO (Method Resolution Order)
Beide Techniken arbeiten "von innen nach außen", dh die meisten lokalen Objekte werden zuerst überprüft, dann werden die äußeren Schichten nacheinander überprüft.
Angenommen, Sie suchen in Ihrem obigen Beispiel nach dem path
Attribut. Wenn es auf eine Referenz wie "self.path
Python " , überprüft Python zuerst die Instanzattribute auf Übereinstimmung. Wenn dies fehlschlägt, wird die Klasse überprüft, aus der das Objekt instanziiert wurde. Schließlich werden die Basisklassen durchsucht. Wie Alex sagte, muss Ihr Attribut, wenn es in der Instanz gefunden wird, nicht woanders gesucht werden, daher sparen Sie ein wenig Zeit.
Wenn Sie jedoch auf Klassenattributen bestehen, benötigen Sie diese zusätzliche Suche. Oder Ihre andere Alternative besteht darin, über die Klasse anstelle der Instanz auf das Objekt zu verweisen, z. B. MyController.path
anstelle vonself.path
. . Dies ist eine direkte Suche, die die verzögerte Suche umgeht. Wie Alex weiter unten erwähnt, handelt es sich jedoch um eine globale Variable. Sie verlieren also das Bit, von dem Sie dachten, dass Sie es speichern würden (es sei denn, Sie erstellen einen lokalen Verweis auf den [globalen] Klassennamen ).
Unter dem Strich sollten Sie die meiste Zeit Instanzattribute verwenden. Es wird jedoch Fälle geben, in denen ein Klassenattribut das richtige Werkzeug für den Job ist. Code, der beide gleichzeitig verwendet, erfordert die größte Sorgfalt, da bei Verwendung self
nur das Instanzattributobjekt und der Schattenzugriff auf das gleichnamige Klassenattribut verfügbar sind. In diesem Fall Sie müssen das Attribut durch die Klassennamen , um es zu verweisen zugreifen.