Python 了解装饰师是如何工作的

Python 了解装饰师是如何工作的,python,python-3.x,decorator,Python,Python 3.x,Decorator,我开始学习装饰师,我已经遇到了一个障碍。首先,这是我的代码 def deco (f): def coucou(): print("this is function{}".format(f)) return f() return coucou @deco def salut(): print("salut") def hi(): return salut() 我会尽量用我糟糕的英语来解释我的问题。如果我理解的话,这就是事情

我开始学习装饰师,我已经遇到了一个障碍。首先,这是我的代码

 def deco (f):

    def coucou():
        print("this is function{}".format(f))
        return f()
    return coucou

@deco
def salut():
    print("salut")


def hi():
    return salut()

我会尽量用我糟糕的英语来解释我的问题。如果我理解的话,这就是事情应该发生的方式:我执行我的
hi()
函数,它返回
sault()
,因为
salt
被装饰者修改
coucou
将被执行,
coucou
返回<代码>礼炮(),我的意思是,我希望有一个无限循环,但那没有发生,我不明白为什么。有人能解释一下装饰师是如何工作的吗?

coucou
中的
f
sall
的未装饰(原始)版本,是的,但是为什么和如何呢?同样,如果我得到了它,装饰程序会修改其定义中的函数,并使其永久指向装饰程序返回的函数,我错了吗?@newgatace它不会修改原始函数。它创建一个新函数,并返回一个新函数。因此,全局名称
sault
现在指的是修饰符返回的函数,即
coucou
,但是
coucou
的本地名称
f
,它是由
coucou
关闭的自由变量,仍然指的是原始函数function@NewgateAce换句话说,,decorator语法没有什么神奇之处。它相当于
def my_function():。。。;my_func=deco(my_func)
@juanpa.arrivillaga我现在明白了,f=deco(f)对我来说更清楚了。谢谢你的回复。@juanpa.arrivillaga我要说的可能很愚蠢,但当我打印“礼炮”和“装饰(礼炮)”时,它们没有相同的参考。。。这可能有助于理解decorators是如何工作的。您可能还需要查看文档:和。