为了账号安全,请及时绑定邮箱和手机立即绑定

关于装饰器的疑问?

# -*- coding: UTF-8 -*-
import time
def foo():
   print 'in foo()'
# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):
   # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
   def wrapper():
       start = time.clock()
       func()
       end = time.clock()
       print 'used:', end - start
   # 将包装后的函数返回
   return wrapper
foo = timeit(foo)
foo()
foo()

通过包装函数,实现了对foo函数的计时功能,

疑问1;通过包装函数后,原来的foo()函数改变了吗?

疑问2:如果后来还要调用原来定义的foo()函数怎么办?

疑问3:同样是实现计时功能,以下程序不是更方便?而且原foo()函数没改变?

def g(func):
   start = time.clock()
   func()
   end = time.clock()
   print 'used:', end - start
g(foo)

正在回答

2 回答

  1. 没有改变。函数名可以看做一个指向该函数的指针, foo = timeit(foo)其实把foo的函数指针指向了timeit 函数,其中timeit返回一个有原来foo函数功能并添加计时的新函数warpper

  2. 并不能调用了,装饰过后只有装饰后的元素了

  3. 这样的场景是没错的,但设想一种场景:你已经写好foo函数了,后面也写了很多调用foo的地方,如果你想统计foo的运行时间,你是不是得把所有用到foo()的地方改写成g(foo),再一个你把这个函数交给别人用,那你是不是就不能改了。所以装饰器的效果就体现出来了,只需要装饰一下后面所有调用foo的地方都不需要去改代码就直接有计时功能了

1 回复 有任何疑惑可以回复我~
#1

Quentin3824726 提问者

非常感谢!
2017-03-25 回复 有任何疑惑可以回复我~
  1. 没有改变。函数名可以看做一个指向该函数的指针, foo = timeit(foo)其实把foo的函数指针指向了timeit 函数,其中timeit返回一个有原来foo函数功能并添加计时的新函数warpper

  2. 并不能调用了,装饰过后只有装饰后的元素了

  3. 这样的场景是没错的,但设想一种场景:你已经写好foo函数了,后面也写了很多调用foo的地方,如果你想统计foo的运行时间,你是不是得把所有用到foo()的地方改写成g(foo),再一个你把这个函数交给别人用,那你是不是就不能改了。所以装饰器的效果就体现出来了,只需要装饰一下后面所有调用foo的地方都不需要去改代码就直接有计时功能了

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

关于装饰器的疑问?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信