Python中的Decorator装饰器的使用示例
作者:漂泊的小森
装饰器(decorator)在Python框架中扮演着重要角色,是Python中实现切面编程(AOP)的重要手段,本文将通过简单的示例和大家介绍下具体的使用方法,希望对大家有所帮助
#最近在网上看代码时,出现了@???的代码,看了好久也不知道是什么意思,经过了解原来是装饰器,我给大家举个例子讲解一下,帮助大家快速理解:
##大家在写函数的时候,可能会想测试这个函数的运行时间,如果每个函数都加一个类似于:
start=time.time() 函数主体 over=time.time() Time=over-start print(Time)
def haha(): start=time.time() for i in range(1200): if i%2==0: print('这是个偶数:',i) over=time.time() print("总共花费的时间:",over-start) haha()
这样函数的可读性也不高,如果要测试好几个函数还会大量浪费时间。
下面引入装饰器:
1简单的装饰器操作:
(先定义一个函数1(里面传递一个参数),然后在函数1里面再定义一个函数2负责计算时间,并在时间中间调用定义函数1的参数,然后返回这个函数2):
!!!当我们想调用装饰器时,只需@函数1的名字,放在想要使用的函数前面即可。
import time def decorator(fun): def wrapper(): t1=time.time() fun() t2=time.time() print('总共花费的时间:',t2-t1) return wrapper @decorator def haha(): #start=time.time() for i in range(1200): if i%2==0: print('这是个偶数:',i) #over=time.time() #print("总共花费的时间:",over-start) haha()
2,装饰器升级版(如果我们想套用的函数中,具有返回对应的值这个功能共时使用):
例如这个函数:
def haha(): a=0 #start=time.time() for i in range(1200): if i%2==0: print('这是个偶数:',i) a=a+i return a
#我们如果还用1中的装饰器就不能返回对应的值,这就需要改动装饰器:
(在装饰器中也要把函数中定义参数的返回值给表示出来,并且利用return 给返回值,输出出来)
import time def decorator1(fun): def wrapper2(): t1=time.time() result=fun() t2=time.time() print('总共花费的时间:',t2-t1) return result return wrapper2 @decorator1 def haha(): a=0 #start=time.time() for i in range(1200): if i%2==0: print('这是个偶数:',i) a=a+i return a #over=time.time() #print("总共花费的时间:",over-start) aaa=haha() print(aaa)
可能有同学会问,为什么后面要用到aaa=haha(),
这是因为我们要接受返回值result,并将其用print()打印出来。
3,装饰器的升级升级版(当我们需要使用的函数haha中,不但有返回值,还有传入的参数时使用。)
(只需要在我们的函数2和调用的函数1中的参数()里面加上关键字传参*args,即可)
import time def decorator1(fun): def wrapper2(*args): t1=time.time() result=fun(*args) t2=time.time() print('总共花费的时间:',t2-t1) return result return wrapper2 @decorator1 def haha(key): a=0 #start=time.time() for i in range(key): if i%2==0: print('这是个偶数:',i) a=a+i return a #over=time.time() #print("总共花费的时间:",over-start) aaa=haha(1200) print(aaa)
可不要忘了,调用函数haha时要传入参数哦。
到此这篇关于Python中的Decorator装饰器的使用示例的文章就介绍到这了,更多相关Python Decorator内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!