python中的装饰器基础

1.计算一个程序执行需要多长时间

 1 import time
 2 #time.time()      1970纪元后经过的浮点秒数
 3 #time.sleep(10)       让程序执行到这个位置的时候停一会儿
 4 
 5 def func():
 6     start = time.time()
 7     print('测试程序的执行时间为多少')
 8     end = time.time()
 9     res = end - start
10     print(res)
11 func()

为了更好的调用

 1 import time
 2 
 3 def timeer(f):
 4     start = time.time()
 5     f()
 6     end = time.time()
 7     res = end - start
 8     print(res)
 9 
10 
11 def func():
12     time.sleep(0.01)       #为了更精准的测出时间
13     print('测试程序的执行时间为多少')
14 
15 timeer(func)

改进

 1 import time
 2 
 3 def func():
 4     time.sleep(0.01)
 5     print('测试软件')
 6 
 7 def timmer(f):           #装饰器函数
 8     def inner():
 9         start = time.time()
10         f()              #被装饰的函数
11         end = time.time()
12         print(end - start)
13     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
14 
15 
16 func = timmer(func)
17 func()
#不想修改函数的调用方式 但是还想在原来的函数前后添加功能
#timmer就是一个装饰器函数只是对一个函数有一些装饰作用

通过闭包函数返回内部函数的名字,然后在外部接收它,让外部接收的变量与外部的函数保持一致,
然后函数名加上括号就会自动的去调用内部的函数

3.开放封闭原则

  开放:对扩展是开放的
封闭:对修改时封闭的
 1 import time
 2 
 3 def timmer(f):           #装饰器函数
 4     def inner():
 5         start = time.time()
 6         f()              #被装饰的函数
 7         end = time.time()
 8         print(end - start)
 9     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
10 
11 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
12 def func():
13     time.sleep(0.01)
14     print('测试软件')
15 
16 def func1():
17     time.sleep(2)
18     print('测试')
19 
20 func()
21 func1()

当func()有返回值时

 1 import time
 2 
 3 def timmer(f):           #装饰器函数
 4     def inner():
 5         start = time.time()
 6         f()              #被装饰的函数
 7         end = time.time()
 8         print(end - start)
 9     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
10 
11 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
12 def func():
13     time.sleep(0.01)
14     print('测试软件')
15     return '测试软件'
16 
17 ret = func()
18 print(ret)           #这样子,我们返回的结果并没有值,因为此时的func指向的
19                      #是inner函数

改进

 1 import time
 2 
 3 def timmer(f):           #装饰器函数
 4     def inner():
 5         start = time.time()
 6         ret = f()              #被装饰的函数
 7         end = time.time()
 8         print(end - start)
 9         return ret
10     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
11 
12 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
13 def func():
14     time.sleep(0.01)
15     print('测试软件')
16     return '测试软件'
17 
18 ret = func()
19 print(ret)           #现在这样子就解决了返回值的问题了

当被调函数含有参数的时候

 1 import time
 2 
 3 def timmer(f):           #装饰器函数
 4     def inner(a):
 5         start = time.time()
 6         ret = f(a)              #被装饰的函数
 7         end = time.time()
 8         print(end - start)
 9         return ret
10     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
11 
12 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
13 def func(a):
14     time.sleep(0.01)
15     print('测试软件',a)
16     return '测试软件'
17 
18 ret = func(1)
19 print(ret)           #当有特殊需求时,可以将inner后参数设成*args或**kwargs

装饰器的固定模式

 1 def wrapper(f):
 2     def inner(*args,**kwargs):
 3         '''
 4         这里加被装饰函数执行前的代码
 5         '''
 6         ret = f(*args,**kwargs)
 7         '''
 8         这里加被装饰函数执行后的代码
 9         '''
10         return ret
11     return inner
12 
13 #调用
14 @wrapper
 
原文地址:https://www.cnblogs.com/rcat/p/9321316.html