2017-01-26 2 views
1

Допустит, у меня есть класс, основанный-декоратор с аргументом, как это:Доступ к атрибутам класса на основе декораторов с аргументами

class Decorator: 
    def __init__(self, arg): 
     self.arg = arg 

    def __call__(self, func): 
     def wrap(): 
      # something with self.arg 
      func() 
     return wrap 

Когда я украшенная функция foo, я могу сделать следующее:

deco = Decorator("ARG") 
def foo(): 
    pass 
foo = deco(foo) 
deco.arg = "CHANGE ARG" 

Доступ к/изменение deco.arg в некотором роде, если я иду с @ -Syntax?

@Decorator("ARG") 
def foo(): 
    pass 

# How to change/access the arg-attribute? 

ответ

1

Вы можете создать закрытие:

def Decorator(arg): 
    class InnerDecorator: 
     def __init__(self, func): 
      self.func = func 
      # make arg an instance attribute 
      self.arg = arg 

     def __call__(self): 
      return self.func() 

    return InnerDecorator 

@Decorator("ARG") 
def foo(): 
    pass 

А затем установите атрибут функции:

>>> foo.arg 
'ARG' 
>>> foo.arg = 'WOW' 
>>> foo.arg 
'WOW' 
+0

@Robert_Jordan нет проблем :) – MSeifert

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