鱼C论坛

 找回密码
 立即注册
查看: 2363|回复: 8

装饰器问题

[复制链接]
发表于 2016-4-11 11:04:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不明白报该错的本质原因,虽然我知道这个函数应该放回一个函数的标签。


  1. import time

  2. def timeslong(func):
  3.     start = time.clock()
  4.     print("It's time starting ! ")
  5.     func()
  6.     print("It's time ending ! ")
  7.     end = time.clock()
  8.     return "It's used : %s ." % (end - start)

  9. @timeslong
  10. def f():
  11.     y = 0
  12.     for i in range(10):
  13.         y = y + i + 1
  14.         print(y)
  15.     return y

  16. f()
复制代码


报错信息:
  1. Traceback (most recent call last):
  2.   File "E:/python_pri/Fishc40.py", line 100, in <module>
  3.     f()
  4. TypeError: 'str' object is not callable
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-4-11 12:27:02 | 显示全部楼层
装饰器的标准写法是:
  1. import time

  2. def timeslong(func):
  3.     def new():
  4.         start = time.clock()
  5.         print("It's time starting ! ")
  6.         a = func()
  7.         print("It's time ending ! ")
  8.         end = time.clock()
  9.         print( "It's used : %s ." % (end - start))  
  10.         return a
  11.     return new
  12. @timeslong
  13. def f():
  14.     y = 0
  15.     for i in range(10):
  16.         y = y + i + 1
  17.         print(y)
  18.     return y

  19. f()
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2016-4-11 13:20
我很赞同!: 5
  发表于 2016-4-11 13:09

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
宋桓公 + 1 + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-11 13:21:20 | 显示全部楼层
来学习!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-11 14:30:34 | 显示全部楼层
我明白了:
@timeslong 等同于 f = timeslong(f)
所以再次调用f()时,就相当于调用了timeslong(f),所以以下代码,实现相同的功能:
  1. import time

  2. class timeslong(object):
  3.     def __init__(self,func):
  4.         self.f = func
  5.     def __call__(self):
  6.         start = time.clock()
  7.         print("It's time starting ! ")
  8.         self.f()
  9.         print("It's time ending ! ")
  10.         end = time.clock()
  11.         return "It's used : %s ." % (end - start)


  12. def f():
  13.     y = 0
  14.     for i in range(10):
  15.         y = y + i + 1
  16.         print(y)
  17.     return y

  18. f = timeslong(f)

  19. print(f())
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-11 14:34:09 | 显示全部楼层
把装饰器分解一下,如下:
  1. f = timeslog(f)
复制代码


timeslog(f) 返回值是一个字符串,赋给f了,f这时候是字符串,当然不能调用了

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
宋桓公 + 1 + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2016-4-11 15:23:06 | 显示全部楼层
挥舞乾坤 发表于 2016-4-11 14:34
把装饰器分解一下,如下:

是的刚刚想到了,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-11 16:49:20 | 显示全部楼层
号高端的样子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-20 14:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表