我正在努力用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_func
和return 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
答案 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
的装饰器版本。您可以在链接的文档中阅读它们。不要太担心它们,它们只是使功能的装饰版本看起来更像原始版本。