问题描述
我想对一个函数执行一些转换并返回一个新函数。
比如说我想要一个函数 translate_arg_of_func(func)
使得
new_func=translate_arg_of_func(func)
new_func(4)
返回 func(4+1)
。我将如何在 python 中执行此操作?
(我不希望 translate_arg_of_func
必须被提供给 func
的参数。)
解决方法
它是一个 decorator,可以这样写:
def translate_arg_of_func(func):
def wrapper(arg):
return func(arg + 1)
return wrapper
,
你基本上是在谈论装饰一个函数:
def translate_arg_of_func(fun):
def new_fun(arg):
return fun(arg + 1)
return new_fun
现在您可以使用以下方法装饰您的函数:
new_func=translate_arg_of_func(func)
甚至直接使用@
来装饰函数:
@translate_arg_of_func
def func(arg):
print(arg)
,
它叫做装饰者模式,欢迎来到装饰者的世界。
例如
def add_more_1(func):
def _mutate_func(*args):
new_arg = args[0]+1
return func(new_arg)
return _mutate_func
def double(x):
return x*2
print(double(2))
@add_more_1
def double_mutate(x):
return x*2
print(double_mutate(2))