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.
+1 za używanie modułu jako przestrzeni nazw. –
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
@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