2017-01-26 55 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