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 
  • Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Kurze Beschreibung der Scoping Regeln?
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Variable Bereiche in Python-Klassen
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • UnboundLocalError bei der Manipulation von Variablen ergibt inkonsistentes Verhalten
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Python überschreibt Variablen in verschachtelten Funktionen
  • Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]
  • "Lokale Variable referenziert vor Zuordnung" - nur Funktionen?
  • Python ist die beste Programmiersprache der Welt.