【问题标题】:Why is decorator called when decorated function is defined?为什么在定义装饰函数时调用装饰器?
【发布时间】:2025-11-26 17:30:01
【问题描述】:

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

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】:

    在您的第二个示例中,装饰器是“错误的”,因为它没有将装饰函数作为参数。另一件事是当some_function 不接受任何参数时,inner 需要一个参数 (f)。 “传统上”,装饰器将装饰函数作为参数,而内部函数将任何参数传递给装饰函数。为什么你的代码会以它的方式工作,这里解释得很好:Using python decorator with or without parentheses

    要返回装饰函数而不调用它或定义的装饰器,您必须在两个示例之间做一些事情:

    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()
    

    【讨论】:

    • 抱歉耽搁了。我会在接下来的几天里回到这个问题