Python中的函数装饰器

Python中的函数装饰器,python,function,return,python-decorators,Python,Function,Return,Python Decorators,我是python的初学者,我正在努力学习python中的函数修饰符。我不知道函数是如何返回函数的 我的意思是,解释器按照什么顺序解释这个函数: def decorator(another_func): def wrapper(): print('before actual function') return another_func() print('pos') return wrapper 这两种说法的区别是什么:- return wr

我是python的初学者,我正在努力学习python中的函数修饰符。我不知道函数是如何返回函数的

我的意思是,解释器按照什么顺序解释这个函数:

def decorator(another_func):
    def wrapper():
        print('before actual function')
        return another_func()
    print('pos')
    return wrapper
这两种说法的区别是什么:-

return wrapper


我使用的是Head First Python,但我觉得这个主题在这里描述得不是很好,请推荐任何视频或好的资源,以便我能够理解。

理解差异的关键是理解Python中的所有内容都是对象,包括函数。如果使用不带括号的函数名(
返回包装器
),则返回实际函数本身。当您使用括号时,您正在调用函数。请看以下示例代码:

def foo(arg):
    return 2

bar = foo
baz = foo()
qux = bar()
bar()

如果您打印baz或qux,它将打印两个。如果打印
,它将为您提供引用函数的内存地址,而不是数字。但是,如果您调用该函数,您现在正在打印th的结果。理解差异的关键是理解python中的所有内容都是对象,包括函数。如果使用不带括号的函数名(
返回包装器
),则返回实际函数本身。当您使用括号时,您正在调用函数。请看以下示例代码:

def foo(arg):
    return 2

bar = foo
baz = foo()
qux = bar()
bar()
如果您打印baz或qux,它将打印两个。如果打印
,它将为您提供引用函数的内存地址,而不是数字。但是,如果您调用该函数,您现在正在打印

我无法理解函数如何返回函数

正如LTheriault所解释的,在python中,一切都是对象。不仅如此,一切都是在运行时发生的,
def
语句是一个可执行语句,它从
def
块中的代码创建一个
function
对象,并将该对象绑定到当前名称空间中的函数名上——对于某些可以手动编码的操作来说,这主要是一种语法上的糖分(尽管是一种非常受欢迎的语法糖分——“手工”构建函数对象需要大量工作)

请注意,将函数作为“一等公民”并不是特定于Python的,这是函数的基础

我的意思是,解释器按照什么顺序解释这个函数:

def decorator(another_func):
    def wrapper():
        print('before actual function')
        return another_func()
    print('pos')
    return wrapper
假设
decorator
函数是在模块顶层声明的:运行时首先获取
def
语句后面的代码块,将其编译成
code
对象,从该
code
对象和其他一些东西创建一个
function
对象(“function”类型的实例”)(参数列表等),并最终将此函数对象绑定到声明的名称(注意:'binds'=>“assigns to”)

内部
def
语句实际上仅在调用外部函数时执行,并且每次调用外部函数时都会重新执行它-IOW,每次调用
decorator
都会返回一个新的函数实例

上面的解释当然相当简单(因此部分不精确),但足以理解基本原理

我无法理解函数如何返回函数

正如LTheriault所解释的,在python中,一切都是一个对象。不仅如此,一切都发生在运行时,
def
语句是一个可执行语句,它从
def
块中的代码创建一个
函数
对象,并将该对象绑定到当前名称包中的函数名对于一些可以手动编码的操作来说,这主要是一种语法糖(尽管这是一种非常受欢迎的语法糖,“手动”构建函数对象需要大量工作)

请注意,将函数作为“一等公民”并不是特定于Python的,这是函数的基础

我的意思是,解释器按照什么顺序解释这个函数:

def decorator(another_func):
    def wrapper():
        print('before actual function')
        return another_func()
    print('pos')
    return wrapper
假设
decorator
函数是在模块顶层声明的:运行时首先获取
def
语句后面的代码块,将其编译成
code
对象,从该
code
对象和其他一些东西创建一个
function
对象(“function”类型的实例”)(参数列表等),并最终将此函数对象绑定到声明的名称(注意:'binds'=>“assigns to”)

内部
def
语句实际上仅在调用外部函数时执行,并且每次调用外部函数时都会重新执行它-IOW,每次调用
decorator
都会返回一个新的函数实例


上面的解释当然非常简单(因此部分不精确),但足以理解基本原理。

“请推荐任何视频或好的资源”=>这里没有-最好的资源是官方语言文档和CPython源代码。“请推荐任何视频或好的资源”=>这里是OT-最好的资源是官方语言文档和CPython源代码。