首页 > 代码库 > python-------装饰器

python-------装饰器

一、简单的装饰器

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 @wrapper
10 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 @timmer
11 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 inner
10 
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 inner
10 
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-------装饰器