免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4279 | 回复: 4
打印 上一主题 下一主题

python装饰器的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-03 22:13 |只看该作者 |倒序浏览
#如下的一段代码:

<代码1>
def logging_decorator(func):
    def wrapper():
        wrapper.count += 1
        print "The function I modify has been called {0} time(s).".format(wrapper.count)
        func()
    wrapper.count = 0
    return wrapper

#问题是: 如果把 wrapper.count = 0 放到 def wrapper() 语句之前,像下面这样:

<代码2>
def logging_decorator(func):
    wrapper.count = 0 #wrapper.count移动到这里,wrapper对象未创建报错
    def wrapper():
        wrapper.count += 1
        print "The function I modify has been called {0} time(s).".format(wrapper.count)
        func()
    return wrapper

#由于执行wrapper.count = 0 时,wrapper()函数对象还没有创建,所以会报 "wrapper对象未创建" 的错误

#然而我不明白的是,如果将wrapper.count = 0放在如 <代码1> 中的位置,在wrapper()函数中执行wrapper.count += 1
#的时候,是如何知道wrapper.count的初始值的呢?

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
2 [报告]
发表于 2013-09-04 10:54 |只看该作者
decorator 是不是在函数里面返回函数?

论坛徽章:
0
3 [报告]
发表于 2013-09-04 10:57 |只看该作者
这与装饰器无关吧,你要创建一个类的属性,当然需要先定义这个类。

论坛徽章:
0
4 [报告]
发表于 2013-09-04 20:41 |只看该作者
本帖最后由 jxing_ing 于 2013-09-04 20:45 编辑

代码1中,  你先定义了一个函数 wrapper, 然后给这个函数对象增加了一个属性 count  值为0
代码2中,你在 wrapper 定义之前尝试访问 wrapper.count, 这时候解释器还不知道 wrapper 是个什么东东, 当然报错啦

> 如果将wrapper.count = 0放在如 <代码1> 中的位置,在wrapper()函数中执行wrapper.count += 1
#的时候,是如何知道wrapper.count的初始值的呢?
------
这个是因为, def 段只是定义了函数体, 但是并不执行函数。也就是wrapper.count += 1 这时候不会被执行。 在定义了函数 wrapper 后,也就可以访问 wrapper.count 了

  1. >>> def f(): f.v=1
  2. ...
  3. >>> f.v    # 函数没有执行 f.v 不存在
  4. Traceback (most recent call last):
  5.   File "<stdin>", line 1, in ?
  6. AttributeError: 'function' object has no attribute 'v'
  7. >>> f()   
  8. >>> f.v   # 函数执行后 f.v 被赋值为1
  9. 1
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-09-05 18:47 |只看该作者
回复 4# jxing_ing
关于为什么报错的问题我是理解的,就是一直想不通执行wrapper.count+=1的时候是怎么知道它的初始值的,看了你的解释终于明白了。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP