python-------装饰器,,一、简单的装饰器1.


一、简单的装饰器

1.为什么要使用装饰器呢?

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

  装饰器的本质:就是一个闭包函数

那么我们先来看一个简单的装饰器:实现计算每个函数的执行时间的功能

技术分享
 1 import time  2 def  wrapper(func): 3         def inner(): 4               start=time.time() 5               func() 6               end=time.time() 7               print(end-start) 8         return inner  9     10 def  hahaha():11         time.sleep(1)12         print(‘aaaaa‘)13 hahaha=wrapper(hahaha)14 hahaha()    
简单的装饰器

技术分享

上面的功能有点不简介,不完美,下面就引进了语法糖。

技术分享
 1 import time 2 def wrapper(func): 3         def inner(): 4                start=time.time() 5                func() 6                end=time.time() 7                print(end-start) 8         return inner 9 @wrapper10 def  kkk():#相当于kkk=wrapper(kkk)11     print(‘aaaaa‘)12 kkk()             
装饰器-------语法糖

以上的装饰器都是不带参数的函数,现在装饰一个带参数的该怎么办呢?

技术分享
 1 import time 2 def timmer(func): 3     def inner(a): 4         start=time.time() 5         func(a) 6         end=time.time() 7         print(end-start) 8     return inner 9 10 @timmer11 def hahaha(a):12     time.sleep(1)13     print(a)14 15 16 hahaha(5)   
带一个参数的装饰器技术分享
 1 import time 2 def timer(func): 3     def inner(*args,**kwargs): 4         start = time.time() 5         re = func(*args,**kwargs) 6         end=time.time() 7         print(end- start) 8         return re 9     return inner10 11 @timer   #==> func1 = timer(func1)12 def func1(a,b):13     print(‘in func1‘)14     print(a,b)15 16 @timer   #==> func1 = timer(func1)17 def func2(a):18     print(‘in func2 and get a:%s‘%(a))19     return ‘fun2 over‘20 21 func1(1,2)22 print(func2(‘aaaaaa‘))
原函数带多个参数的装饰器技术分享
 1 import time 2 def timer(func): 3     def inner(*args,**kwargs): 4         start = time.time() 5         re = func(*args,**kwargs) 6         end=time.time() 7         print(end - start) 8         return re 9     return inner10 11 @timer   #==> func1 = timer(func1)12 def jjj(a):13     print(‘in jjj and get a:%s‘%(a))14     return ‘fun2 over‘15 16 jjj(‘aaaaaa‘)17 print(jjj(‘aaaaaa‘))
带返回值的装饰器

二、开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

三、装饰器的固定结构

技术分享
 1 import time 2 def wrapper(func):  # 装饰器 3     def inner(*args, **kwargs): 4         ‘‘‘函数执行之前的内容扩展‘‘‘ 5         ret = func(*args, **kwargs) 6          ‘‘‘函数执行之前的内容扩展‘‘‘ 7         return ret 8     return inner 9 10 @wrapper  # =====>aaa=timmer(aaa)11 def aaa():12     time.sleep(1)13     print(‘fdfgdg‘)14 aaa()
View Code

python-------装饰器

评论关闭