weiter Echo Mikes und alex Rat und das Hinzufügen meiner eigenen Farbe ...
mit Instanz-Attribute sind die typischen, mehr idiomatische Python. Klassenattribute werden nicht oft verwendet - zumindest nicht in Produktionscode in meinen letzten 13+ aufeinanderfolgenden Jahren von Python. Das selbe gilt für statische und Klassenmethoden ... einfach nicht sehr häufig, es sei denn, es gibt einen speziellen Anwendungsfall oder einen anormalen Programmierer, der zeigen möchte, dass er irgendeine obskure Ecke der Python-Programmierung kennt.
alex erwähnt in seiner Antwort, dass der Zugriff (ein bisschen) schneller sein wird aufgrund einer weniger Ebene der Nachschau ... lassen Sie mich weiter für diejenigen, die nicht wissen, wie das funktioniert noch klären, es ist sehr ähnlich variablen Zugriff - ist nun mal die Suche in dieser Reihenfolge:
- Einheimische
- nonlocals
- Globals
- Einbauten
für Attribut Zugriff ist die Reihenfolge:
- Instanz
- Klasse
- Basisklassen als
in Ihrem Beispiel oben durch die MRO (Methode Auflösung Reihenfolge) bestimmt, die Sie sagen wir mal‘ Das Attribut path
nachschlagen. Wenn es auf einen Verweis wie "self.path
" stößt, sucht Python zuerst nach den Instanzattributen für eine Übereinstimmung. Wenn dies fehlschlägt, überprüft es die Klasse, von der das Objekt instanziiert wurde.Schließlich wird es die Basisklassen durchsuchen. wie alex gesagt hat, wenn dein attribut in der instanz gefunden wird, wird es nicht auf die klasse verzichten, daher hast du ein bisschen zeit gespart.
jedoch, wenn Sie auf Klassenattribute zu bestehen, müssen Sie diese klein wenig Leistung verzichten, oder, Ihre andere Alternative ist, über die Klasse auf das Objekt zu verweisen, statt der Instanz, zB MyController.path
statt von self.path
. Das ist eine direkte Suche, die die verzögerte Suche umgehen wird, aber wie alex unten erwähnt, ist das eine globale Variable, also verlierst du das Bit, von dem du dachtest, dass du es speichern würdest (es sei denn, du erstellst einen lokalen Verweis auf den [globalen] Klassennamen).
Nachdem ich diese Frage gelesen und die Antwort gesehen hatte, war eine meiner ersten Fragen: "Wie greife ich auf Klassenvariablen zu?" Das liegt daran, dass ich bis zu diesem Zeitpunkt nur Instanzvariablen verwendet habe. Als Antwort auf meine eigene Frage machst du das über den Klassennamen selbst, obwohl du es technisch auch über eine Instanz machen kannst. Hier ist ein Link für jeden anderen mit der gleichen Frage zu lesen: http://stackoverflow.com/a/3434596/4561887 –