首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中作为对象的函数的作用域

Python中作为对象的函数的作用域
EN

Stack Overflow用户
提问于 2018-08-19 03:11:07
回答 1查看 29关注 0票数 0

我试图理解python是如何将其函数作为对象来存储和访问的。以下面的代码为例-

代码语言:javascript
复制
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()返回

代码语言:javascript
复制
I got decorated
I am ordinary 2
<function __main__.ordinary()>

现在,如果我在此之后运行此代码

代码语言:javascript
复制
def ordinary():
    print("I am ordinary 3")

pretty()

我仍然得到和以前一样的输出,即使我已经改变了普通的全局定义,也就是说,尽管我已经重新定义了普通,并且pretty中的函数指的是全局普通,但pretty仍然在考虑以前的普通定义

为何会这样呢?很明显,我错在哪里,但我不知道在哪里。如果能有一些见解,我将不胜感激。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-19 03:46:16

即使我已经改变了普通的全局定义,也就是说,尽管我已经重新定义了普通,并且pretty中的功能指的是全局普通,但pretty仍然在考虑以前的普通定义

您没有更改pretty引用的函数对象。您创建了一个新函数,并将其命名为ordinary。原始函数仍然存在,但不能再由名称ordinary引用。

pretty并不知道这一切。它总是引用原来的函数。

在此之前

名称“普通”和函数pretty引用相同的函数:

代码语言:javascript
复制
<function 1>  <-- "ordinary"
              <-- pretty

之后

名称“普通”指的是一个新函数,但pretty仍然指的是原来的函数:

代码语言:javascript
复制
<function 1>  <-- pretty

                "ordinary" -->  <function 2>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51911788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档