【问题标题】:Could someone make me understand the algorithm running behind this in the most detailed way possible?有人可以让我以最详细的方式理解背后运行的算法吗?
【发布时间】:2021-09-10 22:51:32
【问题描述】:

我知道dec1() 是一个decorator 并装饰who_is_nimo() 函数。有几件事让我感到困惑。

  1. 我们不能在dec1(func1)内部不创建nowexec()函数来装饰函数吗?我试过这样做,它给出的输出与以前完全相同(与主代码不同)。
def dec1(func1):
    print("Executing Now!")
    func1()
    print("Executed!")

@dec1
def who_is_nimo():
    print("Nimo")


who_is_nimo
  1. 如果我们运行who_is_nimo(不带括号)并返回nowexec()(带括号),那么输出也是一样的。这到底是怎么回事?

主代码:

def dec1(func1):
    def nowexec():
        print("Executing Now!")
        func1()
        print("Executed!")
    return nowexec

@dec1
def who_is_nimo():
    print("Nimo")


who_is_nimo()

【问题讨论】:

  • 尝试第一个代码了吗?因为它不起作用
  • "如果我们运行 who_is_nimo(不带括号)并返回 nowexec()(带括号),那么输出也是一样的。这里到底发生了什么?不,如果你这样做,会引发错误
  • 需要一个装饰器才能返回一个函数。
  • 当你最后只有who_is_nimo 时,它什么也不做。你可以删除它。
  • @VarghabShib some_func 仅引用该函数。 some_func() 调用函数

标签: python oop decorator


【解决方案1】:

装饰器语法是函数应用的语法糖;基本上,

@dec1
def who_is_nimo():
    print("Nimo")

等价于

def who_is_nimo():
    print("Nimo")


who_is_nimo = dec1(who_is_nimo)

那么dec1的返回值是什么?

在你的第一种情况下,它是它的参数在调用时返回的任何内容。即忽略print产生的输出,

who_is_nimo = who_is_nimo()

在第二种情况下,dec1 每次调用时都会创建一个 new 函数,并且该函数会保留对 dec1 的参数的引用(即关闭)。因此,who_is_nimo 绑定到一个新函数,当调用该函数时,将调用绑定到 who_is_nimooriginal 函数。稍微改名,效果和

def who_is_nimo():
    print("Nimo")

tmp = who_is_limo  # Second reference to function currently bound to who_is_nimo

def nowexec():
    print("Executing Now!")
    tmp()
    print("Executed!")

who_is_nimo = now_exec

主要区别在于,tmp 是一个全局变量,可以轻松更改,影响now_exec 的行为方式。使用装饰器时,func1 是一个 ncn 局部变量,它是now_exec 定义的一部分,不能(轻松)更改。

【讨论】:

  • 在我的第二个sn-p中,你可以看到我在返回时没有执行函数nowexec,因为我没有用括号调用它,那么为什么nowexec()里面的内容在什么时候被执行我调用了who_is_nimo()函数?
  • 因为名字who_is_nimo现在那个函数;你从装饰者那里退回了它。当您编写who_is_nimo() 时,您调用的是该函数,不是绑定到who_is_nimo 的原始函数。该函数只能从 func1 的当前值中的名称 who_is_nimo 访问。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2010-11-11
  • 2011-01-09
  • 2011-06-24
  • 2016-08-30
  • 2013-08-26
相关资源
最近更新 更多