Variable Bereiche in Python-Klassen

Deklarieren einer Variablen in einer Klasse (außerhalb einer Funktion): alle Klassenfunktionen können darauf zugreifen (im Grunde eine öffentliche Variable)

Deklarieren einer Variablen innerhalb einer Funktion innerhalb einer Klasse: nur diese Funktion kann auf sie zugreifen (ihre in diesem Funktionsumfang)

Deklarieren einer Variablen mit Selbst (Variablenname) innerhalb einer Funktion innerhalb einer Klasse: Alle Klassenfunktionen können darauf zugreifen (wie ist das anders als global (Variablenname)?)

Und da es kein privates / geschütztes gibt, ist alles öffentlich, so dass alles, was von einer Klasse aus zugänglich ist, von außerhalb der Klasse zugänglich ist.

Gibt es irgendwelche anderen Nuancen, die ich wissen sollte, oder habe ich es so ziemlich bekommen?

2 Solutions collect form web for “Variable Bereiche in Python-Klassen”

Da die Auflistung in Ihrer Frage nicht 100% klar ist, habe ich beschlossen, es mit einem einfachen Beispiel zu erklären. Es enthält auch einige Dinge wie __something Variablen, die Sie nicht in Ihrer Liste erwähnt haben.

 class Test: a = None b = None def __init__(self, a): print self.a self.a = a self._x = 123 self.__y = 123 b = 'meow' 

Am Anfang sind a und b nur Variablen, die für die Klasse selbst definiert sind – zugänglich über Test.a und Test.b und nicht spezifisch für jede Instanz.

Beim Erstellen einer Instanz dieser Klasse (die dazu führt, dass __init__ ausgeführt wird):

  • print self.a findet keine Instanzvariable und gibt somit die Klassenvariable zurück
  • self.a = a : eine neue Instanzvariable a wird erstellt. Dies schattiert die Klassenvariable so self.a wird nun auf die Instanzvariable verweisen. Test.a auf die Klassenvariable zuzugreifen, müssen Sie nun Test.a
  • Die Zuordnung zu self._x erzeugt eine neue Instanzvariable. Es gilt als "nicht Teil der öffentlichen API" (aka geschützt), aber technisch hat es kein anderes Verhalten.
  • Die Zuordnung zu self.__y erzeugt eine neue Instanzvariable namens _Test__y , dh ihr Name ist verstümmelt, es sei denn, Sie verwenden den verstümmelten Namen, auf den es nicht von außerhalb der Klasse zugegriffen werden kann. Dies könnte für "private" Variablen verwendet werden.
  • Die Zuordnung zu b erzeugt eine lokale Variable. Es ist nicht überall verfügbar, aber die Funktion __init__ , da es nicht in der Instanz, Klasse oder globalen Bereich gespeichert ist.

Das Deklarieren einer Variablen auf der obersten Ebene der Klasse ist wie das Deklarieren einer statischen oder Klassenvariablen. Wenn Sie es mit sich selbst qualifizieren, wird eine Instanzvariable angegeben. Klassenvariablen können durch Klassenbezeichnung (zB Class.x = 5 ) modifiziert werden, und alle Instanzen werden diese Änderungen erben. Instanzvariablen sind privat zu einer Instanz und können nur durch diese Instanz geändert werden.

Sie können eine gewisse Zugriffskontrolle mit Unterstrichen erreichen. Siehe private Variablen im Python-Tutorial . Nach Konvention, Variablen beginnend mit einem Unterstrich, zB _foo sind nicht-öffentliche Teile einer API, und Namen beginnend mit zwei Unterstrichen zB __foo wird es den Namen mangled sein , um _classname__foo .

  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • "Lokale Variable referenziert vor Zuordnung" - nur Funktionen?
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Python - Wie man eine globale Variable aus einer Funktion
  • Wie kann man neue Scopes in Python schaffen?
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Python ist die beste Programmiersprache der Welt.