为什么定义装饰函数时会调用装饰器?

问题描述 投票:0回答:1

我想要一个装饰器,它可以在定义时将函数添加到任何类型的函数集合中。 我对装饰器的理解是,当调用装饰函数时,就会调用装饰器,如下例所示:

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()
),这对于普通的装饰器来说是不需要的。

我的问题是:

  • 这是一种有效的装饰器类型吗?
  • 它是如何运作的?为什么定义函数时会调用装饰器?
python-3.x python-decorators
1个回答
0
投票

在第二个示例中,装饰器是“错误的”,因为它不将装饰函数作为参数。另一件事是,当

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
© www.soinside.com 2019 - 2024. All rights reserved.