我试图理解python是如何将其函数作为对象来存储和访问的。以下面的代码为例-
def make_pretty(func):
def inner():
print("I got decorated")
func()
return func
return inner
def ordinary():
print("I am ordinary 2")
ordinary()
pretty=make_pretty(ordinary)
pretty()
执行时,pretty()返回
I got decorated
I am ordinary 2
<function __main__.ordinary()>
现在,如果我在此之后运行此代码
def ordinary():
print("I am ordinary 3")
pretty()
我仍然得到和以前一样的输出,即使我已经改变了普通的全局定义,也就是说,尽管我已经重新定义了普通,并且pretty中的函数指的是全局普通,但pretty仍然在考虑以前的普通定义
为何会这样呢?很明显,我错在哪里,但我不知道在哪里。如果能有一些见解,我将不胜感激。谢谢
发布于 2018-08-19 03:46:16
即使我已经改变了普通的全局定义,也就是说,尽管我已经重新定义了普通,并且pretty中的功能指的是全局普通,但pretty仍然在考虑以前的普通定义
您没有更改pretty
引用的函数对象。您创建了一个新函数,并将其命名为ordinary
。原始函数仍然存在,但不能再由名称ordinary
引用。
pretty
并不知道这一切。它总是引用原来的函数。
在此之前
名称“普通”和函数pretty
引用相同的函数:
<function 1> <-- "ordinary"
<-- pretty
之后
名称“普通”指的是一个新函数,但pretty
仍然指的是原来的函数:
<function 1> <-- pretty
"ordinary" --> <function 2>
https://stackoverflow.com/questions/51911788
复制相似问题