2012-10-23 11 views
9

Mam więc klasę, której używam jako lokalnej przestrzeni nazw. Mam pewne funkcje statyczne w klasie, ale nie mają one dostępu do zmiennych zakresu klasy. Dlaczego to?Jak uzyskać dostęp do zmiennych klasy bez własnego?

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 

Wszelkie myśli?

Odpowiedz

10

Python nie pozwala zmienne klasy wpaść zakres ten sposób, istnieją dwa sposoby, aby to zrobić, najpierw jest użycie metody klasy:

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

Które Uważam to najlepsze rozwiązanie.

Drugim jest dostęp według nazwy:

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

Należy pamiętać, że w ogóle, przy użyciu klasy jako nazw nie jest najlepszym sposobem, aby to zrobić, wystarczy użyć modułu z funkcji najwyższego poziomu zamiast tego, ponieważ działa to bardziej, jak chcesz.

Przyczyna braku takiego zakresu wynika głównie z dynamicznej natury Pythona, jak by to działało, gdy wstawia się funkcję do klasy? Musiałoby to być warunkowo dodane do specjalnego zachowania, co byłoby niezwykle kłopotliwe w implementacji i potencjalnie kruche. Pomaga to również zachować jawność, a nie implicyt - jasne jest, czym jest zmienna klasy, w przeciwieństwie do zmiennej lokalnej.

+0

+1 za używanie modułu jako przestrzeni nazw. –

+1

W kompilacji klasy 3.x każda funkcja odwołująca się do '__class__' staje się zamknięciem. Komórka dla '__class__' jest ustawiana przez nową wbudowaną funkcję' __build_class__'. 'staticmethod' jest usuwany z 3.x, więc prosta funkcja zdefiniowana w klasie może odwoływać się do' __class__'. – eryksun

+0

@DanielRoseman Głównym powodem, dla którego nie używam modułu jako przestrzeni nazw, jest to, że mam zagnieżdżone klasy zagnieżdżonych przestrzeni nazw i nie jest łatwo zarządzać tak wieloma małymi plikami. – Lucretiel

Powiązane problemy