2016-03-01 2 views
-2
class A(object): 
    def wrapped(self, func): 
     func.string = self.get_something() 
     return func 

    def get_something(self): 
     return "something" 

    @wrapped 
    def main(self): 
     print self.main.string 
a = A() 
a.main() 

TypeError: wrapped() takes exactly 2 arguments (1 given)Python декораторы в классах Ошибка

+4

Что вы хотите сказать? – zondo

+1

'wrapped' вызывается до того, как класс даже существует ... поэтому нет экземпляров (очевидно) и, следовательно, ничего, что можно было бы считать« самоуверенным »... Что вы на самом деле пытаетесь выполнить? – mgilson

+0

Я хочу использовать статические переменные в основном. Таким образом, переменные будут назначаться при вызове основной функции, а не A() – Jeffery

ответ

0

wrapped() вызывается при определении main(). Когда он вызывается, он не указан self, потому что нет экземпляра A, который может быть присвоен wrapped(). Чтобы делать то, что вы хотите, не используйте декораторы. Вместо этого определите метод __init__(), который назначает правильные атрибуты. Однако я не знаю, почему вы хотите, чтобы это был атрибут self.main(). Как правило, не рекомендуется добавлять атрибуты к функциям. У вас уже есть класс; используй это. Просто определите self.string вместо self.main.string.

+0

Я хочу использовать статические переменные в main(). – Jeffery

+0

В этом случае определите их в 'main()'. – zondo

Смежные вопросы