Wie kann ich innerhalb von Klassenmethoden in Python auf "statische" Klassenvariablen zugreifen?

162

Wenn ich den folgenden Python-Code habe:

class Foo(object):
    bar = 1

    def bah(self):
        print(bar)

f = Foo()
f.bah()

Es beschwert sich

NameError: global name 'bar' is not defined

Wie kann ich barinnerhalb der Methode auf Klasse / statische Variable zugreifen bah?

Ross Rogers
quelle
Weitere Informationen zu Python und Statik finden Sie hier: stackoverflow.com/questions/68645/python-static-variable
bedwyr

Antworten:

166

Anstelle von barverwenden self.baroder Foo.bar. Durch Zuweisen zu Foo.barwird eine statische Variable erstellt, und durch Zuweisen zu self.barwird eine Instanzvariable erstellt.

Pavel Strakhov
quelle
12
Foo.bar funktioniert, aber self.bar erstellt eine Instanzvariable, keine statische.
Bedwyr
47
bedwyr, "print self.bar" erstellt keine Instanzvariablen (obwohl die Zuweisung zu self.bar erfolgt).
Constantin
@Constantin - das habe ich nicht bemerkt, es ist eine interessante Unterscheidung. Danke für die Korrektur :-)
Bedwyr
2
Wenn Sie jedoch nicht beabsichtigen, dass es einen Ivar gibt, ist es klarer, Foo.classmember zu verwenden.
mk12
2
Wenn Sie statische Variablen verwenden, sollten Sie die Fallstricke hier lesen: stackoverflow.com/questions/68645/… . @Constantin gibt eine der vielen Fallstricke.
Trevor Boyd Smith