2012-10-23 40 views
9

Also ich habe eine Klasse, die ich als einen lokalen Namespace verwende. Ich habe einige statische Funktionen in der Klasse, aber sie können nicht auf die Klassenbereichsvariablen zugreifen. Warum ist das?Zugriff auf Klassenbereichsvariablen ohne Selbst?

class Foo: 
    foo_string = "I am a foo" 

    @staticmethod 
    def foo(): 
     print foo_string 

>>> Foo.foo() 
    [Stack Trace] 
    NameError: global name 'foo_string' is not defined 

Irgendwelche Gedanken?

Antwort

10

Python nicht lassen Klassenvariablen in den Gültigkeitsbereich fallen auf diese Weise gibt es zwei Möglichkeiten, dies zu tun, die erste ist eine Klassenmethode zu verwenden:

@classmethod 
def foo(cls): 
    print(cls.foo_string) 

Was ich behaupten würde, ist die beste Lösung.

Die zweite ist für den Zugriff nach Namen:

@staticmethod 
def foo(): 
    print(Foo.foo_string) 

, dass in der Regel beachten Sie, eine Klasse unter Verwendung als ein Namespace nicht der beste Weg ist, es zu tun, einfach ein Modul mit Top-Level-Funktionen verwenden statt dessen, da dies mehr wie gewünscht wirkt.

Der Grund für das Fehlen von Scoping wie dieses ist hauptsächlich aufgrund Pythons dynamischer Natur, wie würde es funktionieren, wenn Sie eine Funktion in die Klasse einfügen? Es müsste bedingt ein besonderes Verhalten hinzugefügt werden, was äußerst umständlich zu implementieren und möglicherweise fragil wäre. Es hilft auch, die Dinge eher explizit als implizit zu halten - es ist klar, was eine Klassenvariable im Gegensatz zu einer lokalen Variable ist.

+0

+1 für die Verwendung eines Moduls als Namespace. –

+1

Bei der 3.x-Klassenkompilierung wird jede Funktion, die auf "__class__" verweist, zu einem Abschluss. Die Zelle für "__class__" wird durch die neue eingebaute Funktion "__build_class__" gesetzt. 'staticmethod' wird aus 3.x entfernt, sodass eine einfache Funktion, die in einer Klasse definiert ist, auf' __class__' verweisen kann. – eryksun

+0

@DanielRoseman Der Hauptgrund, warum ich kein Modul als Namespace verwende, ist, dass ich Klassen für verschachtelte Namespaces verschachtelt habe und es schwierig ist, so viele kleine Dateien zu verwalten. – Lucretiel

Verwandte Themen