python装饰器wrappe_Python进阶-III 函数装饰器(Wrapper)

1、引入场景:

检查代码的运行时间

importtimedeffunc():

start=time.time()

time.sleep(0.12)print('看看我运行了多长时间!')

end=time.time()print('此段代码运行时长为:%s'%(end -start))

func()

如果有大量的函数要检查,这样加入代码太费功夫!考虑提取为一个函数,要检查时直接调用即可

defcheck_time(f):

start=time.time()

time.sleep(0.12)

f()

end=time.time()print('此段代码运行时长为:%s' % (end -start))

check_time(func)

还是有问题,有人嫌每次都去调用该函数很麻烦!

能不能,在不修改要测试远行时长的函数的调用方式前提下,还想在原来的函数前后添加测试时长功能?

def timing(f): #装饰器函数

definner():

start=time.time()

time.sleep(0.12)

f()#被装饰函数

end =time.time()print('此段代码运行时长为:%s' % (end -start))returninner

func=timing(func)

func()

这里就可以定义装饰器函数了,用来装饰其他函数,添加相关功能的函数叫装饰器函数

2、语法糖的使用

@timing #@装饰器函数名 相当于前面函数调用前的赋值:func_to = timing(func_to)

def func_to(): #被装饰的函数

a = 1000000b= 1223434

return a *b

func_to()

3、装饰器的作用

不想修改函数的调用方式 但是还想在原来的函数前后添加功能

上面的例子中timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用

4、装饰带参数的函数

deftiming_arg(f):definner(a):

start=time.time()

re=f(a)

end=time.time()print('此段代码运行时长为:%s' % (end -start))returnrereturninner

@timing_argdeffunc_have_arg(a):

result= a * 10000000

return result

5、装饰带可变参数的函数

1 def wrapper(f): #装饰器函数,f是被装饰的函数

2 def inner(*args, **kwargs):3 '''在被装饰函数之前要做的事'''

4 ret = f(*args, **kwargs) #被装饰的函数

5 '''在被装饰函数之后要做的事'''

6 returnret7

8 returninner9

10 @wrapper #语法糖 @装饰器函数名

11 def func_101(a, b): #被装饰的函数

12 time.sleep(0.01)13 print('老板好同事好大家好', a, b)14 return '新年好'

15

16 print(func_101(100, b=200))

6、编程原则: 开放封闭原则#

开放 : 对扩展是开放的

封闭 : 对修改是封闭的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值