Python:函数作为对象的混淆示例

2024-05-13 20:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

当我重新研究一下decorators时,我偶然发现了一些相当混乱的代码,这些代码在传递变量和函数时让我感到困惑。你知道吗

def get_text(name):
    return "lorem ipsum, {0} dolor sit amet".format(name)

def p_decorate(func):
    def func_wrapper(name):
        return "<p>{0}</p>".format(func(name))
    return func_wrapper

my_get_text = p_decorate(get_text)

print my_get_text("John")

# <p>Outputs lorem ipsum, John dolor sit amet</p>

我理解将函数作为变量传递的概念(这很酷),但是它被多次传递的方式让我困惑。my_get_text已被分配给具有参数的函数(另一个函数)。然而,就在那之后,我们引用这个新变量并将参数传递给它(“John”)。“约翰”在func_wrapper()中的传递方式也令人困惑。你知道吗

my_get_text如何接收更多参数,以及如何将其传递给内部函数?你知道吗

谢谢


Tags: 函数代码textnamegetreturnmydef
1条回答
网友
1楼 · 发布于 2024-05-13 20:24:02

这是一个decorator如何工作的演示:它们基本上将decorator函数包装到另一个内部函数中并返回其引用。你知道吗

  1. 在您的示例中,调用my_get_text = p_decorate(get_text)调用函数p_decorate,可包装函数作为参数(get_text)。你知道吗
  2. 返回值是对新定义的函数的引用,该函数只接受一个参数name。这个返回值被赋给变量名my_get_text
  3. my_get_text现在是可调用的,因为它是一个函数引用。你知道吗
  4. 如果您调用my_get_text,它将调用由装饰器创建的函数,并将参数name(在您的例子中是'John')交给您。你知道吗
  5. 函数创建<p>-标记并在它们之间推送一个字符串。这个字符串是从步骤1中提供给decorator的函数调用中获得的:它是经过修饰的调用的返回值。你知道吗

顺便说一下,由于每次修饰函数时都会重新定义函数func_wrapper(请参见闭包),因此返回值是指向全新函数的函数引用。
比较内存地址:

a = p_decorate(get_text)
b = p_decorate(get_text)
print(a == b)
print(a)
print(b)

>>> False
>>> <function func_wrapper at 0x02ADFF30>
>>> <function func_wrapper at 0x02ADFF70>

函数是用非常相同的调用定义的,但是由于它们是闭包,函数指针指向另一个内存地址(即不同的函数)。你知道吗

相关问题 更多 >