Wie kann ich auf eine Klassenvariable in einem Initialisierer in Python zugreifen?

Ich dachte, dass eine class in Python einen Umfang schafft. Aber wenn ich diesen einfachen Code versuche, bekomme ich einen Fehler:

 class A(): foo = 1 def __init__(self): print foo a = A() NameError: global name 'foo' is not defined 

Warum ist foo nicht vom Initialisierer zugänglich? Was ist der richtige Weg, um darauf zuzugreifen?

One Solution collect form web for “Wie kann ich auf eine Klassenvariable in einem Initialisierer in Python zugreifen?”

Klassen erstellen keinen Bereich. Dies ist in pep 227 dokumentiert:

Namen im Klassenbereich sind nicht zugänglich. Die Namen werden im innersten umschließenden Funktionsumfang aufgelöst. Wenn eine Klassendefinition in einer Kette von verschachtelten Bereichen auftritt, überspringt der Auflösungsprozess Klassendefinitionen.

Und in der class zusammengesetzte Anweisung Dokumentation :

Die Suite der Klasse wird dann in einem neuen Ausführungsrahmen ausgeführt (siehe Abschnitt Benennen und Binden ), mit einem neu erstellten lokalen Namespace und dem ursprünglichen globalen Namespace. (In der Regel enthält die Suite nur Funktionsdefinitionen.) Wenn die Suite der Klasse die Ausführung beendet, wird ihr Ausführungsrahmen verworfen, aber der lokale Namespace wird gespeichert . [4] Ein Klassenobjekt wird dann mit der Vererbungsliste für die Basisklassen und den gespeicherten lokalen Namespace für das Attributwörterbuch erstellt.

Hervorhebung von mir; Der Ausführungsrahmen ist ein vorübergehender Bereich.

Um auf foo zuzugreifen, benutze self.foo :

 class A(): foo = 1 def __init__(self): print self.foo 

Oder auf die A Klasse nach Namen zugreifen oder den type(self) um auf die aktuelle Klasse zuzugreifen (die eine Unterklasse sein könnte):

 def __init__(self): print A.foo 

oder

 def __init__(self): print type(self).foo 
  • Blockieren Sie den Bereich in Python
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Scoping in Python 'für' Schleifen
  • Mit einer Variablen in einem Versuch, Fang, endgültige Aussage, ohne es draußen zu erklären
  • Variabler Bereich (Python Newbie)
  • Pythonumfang [doppelte]
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Wie man globale Variablen unter verschiedenen Modulen in Python hat
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Python ist die beste Programmiersprache der Welt.