Возможно, название немного вводит в заблуждение, однако я хотел создать простой декоратор, чтобы украсить некоторые методы класса как «разрешенные» в механизме RPC, но я застрял на странной ошибке при попытке доступа к переменным класса (Python 2.7.5). Проверьте код ниже:Класс Python не в глобалях при использовании декоратора
class myclass():
rpcallowedmethods = []
def __init__(self):
pass
def rpcenabled(fn):
print fn
print globals()
print myclass
@rpcenabled
def somefunc(self,param):
pass
c = myclass()
Исключение: NameError: global name 'myclass' is not defined
Любой человек может объяснить причину этого мне?
EDIT: Что я прошу, это больше о том, что python выполняет декоратор, определенный в классе, и работает против декорированных методов класса, даже до того, как был класс в глобальных переменных, поэтому я полагал, что это скорее логическая ошибка "в реализации python, чем кажущееся очевидным NameError
Декоратор 'rpcenabled' не имеет смысла. Прежде всего, это не должно быть определено _inside_ вашего класса, во-вторых, «NameError» исходит из оператора печати _within_ вызов 'rpcenabled', поскольку' myclass' еще не определен, когда выполняется декоратор (который во время _creation_ объекта класса - ваш класс компилируется и еще не существует). Ваш 'print globals()' должен был показать вам это. Что вы на самом деле хотите, чтобы декоратор сделал? – l4mpi
Я не знал, что у python есть такой селективный синтаксический анализатор, поскольку он уже был в определении класса, я думал, что он должен был проанализировать его перед выполнением любых декорированных методов ... –
Ну, парсер в основном работает так, как при создании классов : он создает пустой объект класса, принимает весь код, принадлежащий определению класса, заполняет объект класса, выполняя все инструкции на уровне класса (создание функций, выполнение декораторов функций, назначение переменных класса), передает заполненный объект класса в любой класс декораторы и _then_ присваивает результат названию класса в области surronding.Это назначение - последний шаг в этом процессе. В вашем конкретном случае просто передайте свой 'rpcallowedmethods' список декоратору вместо использования класса. – l4mpi