鱼C论坛

 找回密码
 立即注册
查看: 760|回复: 4

python修饰符问题

[复制链接]
发表于 2018-7-26 15:23:33 | 显示全部楼层 |阅读模式

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

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

x
  1. import time

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

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

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


这段代码想问最后为啥是print(f()),而不是print(timeslong()) 这种??我百度看了好几篇文章,自己的理解是修饰符会把下面的f()整个函数传入到func这个参数里面。那为啥打印是f()??

还有关于修饰符在类中的使用,不是很明白,请问这个f()是传到func里了吗?如果传进去了,这个代码貌似没有创建实例化对象啊,为啥也能运行??还是哪一步就是创建我没看出来?
  1. class timeslong(object):
  2. def __init__(self,func):
  3.     self.f = func
  4. def __call__(self):
  5.     start = time.clock()
  6.     print("It's time starting ! ")
  7.     self.f()
  8.     print("It's time ending ! ")
  9.     end = time.clock()
  10.     return "It's used : %s ." % (end - start)

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

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

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

使用道具 举报

发表于 2018-7-26 16:23:06 | 显示全部楼层
1.print(timeslong())的话缺少参数,如果是print(timeslong(f)())的话会打印两次
2.第二个的话执行了__init__就实例化了。
毕竟修饰符我也不是很懂,为你召唤大神:
@冬雪雪冬 @~风介~ @hldh214
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 16:49:27 | 显示全部楼层
无符号整形 发表于 2018-7-26 16:23
1.print(timeslong())的话缺少参数,如果是print(timeslong(f)())的话会打印两次
2.第二个的话执行了__ini ...

1.我还是不明白。f()不是times里面一个参数吗,为啥是打印f()
2. 就是我们一般性会t = Timeslong(),生成一个对象,然后用t.  来调用。可是这里没有,为啥哩?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 16:56:19 | 显示全部楼层
mesica 发表于 2018-7-26 16:49
1.我还是不明白。f()不是times里面一个参数吗,为啥是打印f()
2. 就是我们一般性会t = Timeslong(), ...

1.打印f() = 打印timeslong(f)()
2.估计是相当于timeslong.__init__(f)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 18:05:15 | 显示全部楼层
问题1,按说应该是print(timeslong(f)),但作为装饰器,@timeslong放在def f():前面就相当于套在f的外面,这时print(f())时会自动先执行外面的timeslong
问题2,我不是很确定,应该是在@timeslong时成为f的装饰器时实例化的,在def __init__(self,func):多加一个参数def __init__(self,func, w):,再运行时就会出错
Traceback (most recent call last):
  File "D:\py\test2.py", line 13, in <module>
    @timeslong
TypeError: __init__() missing 1 required positional argument: 'w'
可以看到错误出在@语句上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 01:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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