用python编写的实际装饰器是什么?

时间:2018-05-29 14:21:49

标签: python decorator

我正在努力用python理解装饰器。 我的理解如下:

首先,my_function_too(x,y)方法将在my_decorator(func)中定义为func,然后function_that_runs_func(*args,**kwargs)方法将被输出。

1。 @functools.wraps(func)中的func是什么?

2。为什么我们需要在这里写return function_that_runs_funcreturn my_decorator

我的朋友解释说function_that_runs_func()方法将取代my_function_too()方法。但我无法理解他在说什么以及为什么。

第3。有人请温柔地告诉我他的意思吗?

CODE:

def decorator_with_arguments(number):
   def my_decorator(func):
       @functools.wraps(func)
       def function_that_runs_func(*args,**kwargs):
           print("In the decorator")
           if number == 56:
               print("Not running the function")
               return None
           else:
               print("Running the 'real' func")
               return func(*args,**kwargs)
        return function_that_runs_func
     return my_decorator
@decorator_with_arguments(57)
def my_function_too(x,y)
    print(x+y)

my_function_too(57,67)

输出:

  

在装饰者

中      

124

1 个答案:

答案 0 :(得分:0)

考虑将args作为装饰工厂的装饰器可能会有所帮助。因此my_decorator会返回my_decorator,这会进行实际的装饰。

也就是说,my_function_too接收原始版本的my_function_too作为其arg并返回装饰版本,将其绑定到名称my_function_too = my_decorator(my_function_too) ,就像你做的那样

func

在您的代码中,@functools.wraps(func)中的my_decorator是传递给my_function_too的函数,在这种情况下是functools.wraps的原始版本。 {{1}}是functools.update_wrapper的装饰器版本。您可以在链接的文档中阅读它们。不要太担心它们,它们只是使功能的装饰版本看起来更像原始版本。