我想要一个装饰器,它可以在定义时将函数添加到任何类型的函数集合中。 我对装饰器的理解是,当调用装饰函数时,就会调用装饰器,如下例所示:
def my_decorator(func):
def inner():
print("I am making things nicer")
func()
return inner
print("Function is defined")
@my_decorator
def my_function():
print(f"I am doing something")
print("Function is called")
my_function()
输出:
Function is defined
Function is called
I am making things nicer
I am doing something
有大量关于其工作原理的资源(
my_decorator(my_function)
...)。
但是,如果内部函数没有调用而是返回
f()
,那么装饰器在定义被装饰函数时就会被调用。
def my_decorator():
def inner(f):
print("I am making things nicer")
return f
return inner
print("Function is defined")
@my_decorator()
def doing_something():
print(f"I am doing something")
print("Function is called")
doing_something()
输出:
Function is defined
I am making things nicer
Function is called
I am doing something
这正是我想要实现的目标,但我不知道它是如何工作的。我还发现它只适用于额外的括号(
@my_decorator()
),这对于普通的装饰器来说是不需要的。
我的问题是:
在第二个示例中,装饰器是“错误的”,因为它不将装饰函数作为参数。另一件事是,当
inner
不接受任何参数时,f
需要一个参数 (some_function
)。 “传统上”装饰器将被装饰函数作为参数,而内部函数则采用传递给被装饰函数的所有参数。为什么你的代码会这样工作,这里有很好的解释:使用带或不带括号的 python 装饰器
要返回装饰函数而不调用它,或返回定义时的装饰器,您必须在两个示例之间做一些事情:
def my_decorator(f):
def inner():
print("I am making things nicer")
return f
return inner
print("Function is defined")
@my_decorator
def doing_something():
print("I am doing something")
print("Function is called")
f_ret = doing_something()
print("Function saved to variable")
f_ret()
输出:
Function is defined
Function is called
I am making things nicer
Function saved to variable
I am doing something