2012-06-18 121 views
4

我有關於在Python中乾淨的thory的問題。當:Python裝飾器理論

@decorator_func 
def func(bla, alba): 
    pass 

等同於:

def func(bla, alba): 
    pass 
func = decorator_func(func) 

所以:

@decorator_func(aaa, bar) 
def func(bla, alba): 
    pass 

等同放着清單...?

回答

8

它等同於:

def func(bla, alba): 
    pass 
func = decorator_func(aaa, bar)(func) 

或者:

def func(bla, alba): 
    pass 
decorator = decorator_func(aaa, bar) 
func = decorator(func) 

所以在你的第二個例子,decorator_func應該是返回一個可調用的可調用。

下面是這種結構的一個例子:

class prepend_two_arguments: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def __call__(self, f): 
     def wrapped_function(*args, **kwargs): 
      return f(self.a, self.b, *args, **kwargs) 
     return wrapped_function 

@prepend_two_arguments(1,2) 
def f(a, b, c): 
    return a+b+c 
print(f(3)) # 6 

而另外一個,只使用功能:

def add_to_result(x): 
    def decorator(fn): 
     def wrapped_function(*args, **kwargs): 
      return fn(*args, **kwargs)+x 
     return wrapped_function 
    return decorator 

@add_to_result(3) 
def my_func(a, b): 
    return a+b 
print(my_func(1,2)) # 6 
1

下面是作品使用閉包一個裝飾作用的一個例子:

def print_string_before(string): 
    def decorator_fn(fn): 
     def wrapped_fn(*args, **kwargs): 
      print string 
      return fn(*args, **kwargs) 
     return wrapped_fn 
    return decorator_fn 

請注意,裝飾器可以同樣返回裝飾的功能(或類),哈維ng以某種方式修改它(例如,設置一個屬性)。