Как и во всех хороших примерах, вы упростили то, что вы на самом деле пытаетесь сделать. Это хорошо, но стоит отметить, что python обладает большой гибкостью, когда речь идет о переменных класса и экземпляра. То же самое можно сказать и о методах. Для хорошего списка возможностей я рекомендую прочитать введение в классы нового стиля Михаэля Фетша , особенно разделы со 2 по 6.
Одна вещь, которую нужно запомнить, чтобы начать работу, это то, что python - это не Java. Больше, чем просто клише. В Java весь класс компилируется, что делает разрешение пространства имен по-настоящему простым: любые переменные, объявленные вне метода (где угодно), являются переменными экземпляра (или, если они статические, класса) и неявно доступны внутри методов.
В Python главное правило заключается в том, что есть три пространства имен, которые ищутся по порядку для переменных:
- Функция / метод
- Текущий модуль
- Встроенные команды
{begin pedagogy}
Есть ограниченные исключения из этого. Главное, что приходит мне в голову, это то, что при загрузке определения класса определение класса является его собственным неявным пространством имен. Но это длится только до тех пор, пока модуль загружается, и полностью игнорируется в методе. Таким образом:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
но:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
В конце концов, что нужно помнить, что вы действительно имеете доступ к любой из переменных , которые вы хотите получить доступ, но , вероятно , не неявно. Если ваши цели просты и понятны, то, вероятно, будет достаточно перейти на Foo.bar или self.bar. Если ваш пример усложняется, или вы хотите заняться такими причудливыми вещами, как наследование (вы можете наследовать статические методы / методы класса!), Или идея ссылки на имя вашего класса внутри самого класса кажется вам неправильной, проверьте вступление я связал.