Как получить доступ к переменным области видимости без себя?

Итак, у меня есть класс, который я использую в качестве локального пространства имен. У меня есть некоторые статические функции в классе, но они не могут получить доступ к переменным области видимости класса. Почему это?

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

есть идеи?

Ответы на вопрос(1)

Решение Вопроса

есть два способа сделать это, первый - использовать метод класса:

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

Что я бы сказал, это лучшее решение.

Второй доступ к имени:

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

Обратите внимание, что в общем случае использование класса в качестве пространства имен - не лучший способ сделать это, просто используйте вместо этого модуль с функциями верхнего уровня, так как это действует больше, чем вы хотите.

Причина отсутствия такой ограниченной области видимости в основном из-за динамической природы Python, как она будет работать, когда вы вставляете функцию в класс? К этому условию должно быть добавлено специальное поведение, что было бы крайне неудобно для реализации и потенциально хрупко. Это также помогает сделать вещи явными, а не неявными - ясно, что такое переменная класса, а не локальная переменная.

 Lucretiel09 сент. 2013 г., 19:16
@DanielRoseman Основная причина, по которой я не использую модуль в качестве пространства имен, заключается в том, что у меня есть вложенные классы для вложенных пространств имен, и неудобно управлять таким количеством маленьких файлов.
 eryksun23 окт. 2012 г., 23:13
В компиляции класса 3.x любая функция, которая ссылается__class__ становится закрытием. Ячейка для__class__ устанавливается новым__build_class__ встроенная функция.staticmethod удаляется из 3.x, поэтому простая функция, определенная в классе, может ссылаться__class__.
 Daniel Roseman23 окт. 2012 г., 21:51
+1 за использование модуля в качестве пространства имен.

Ваш ответ на вопрос