欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

Python小白学习之函数装饰器

发布时间:2025/3/21 python 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python小白学习之函数装饰器 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

装饰器

2018-10-25 13:49:37


装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器。

一般函数操作(不用装饰器):

1 import time 2 print(time.time()) 3 def i_can_sleep(): 4 time.sleep(3) 5 start = time.time() 6 i_can_sleep() 7 stop = time.time() 8 print("函数运行了%s"%(stop - start))

 

执行结果:

 

使用装饰器:

下面程序分为4步走(外部函数、返回嵌套函数、嵌套函数+语法糖(@装饰函数简写)+被装饰函数+调用被装饰的函数);若有大量的调用函数i_can_sleep并查看程序运行了多长时间,我们就嘚不厌其烦的定义新的start和stop变量,然后打印时间 为此,我们就需要更简单的方法,装饰器,把这些重复的工作封装到装饰函数中也就是封装到@装饰函数名(语法糖) 代码如下:
1 ################################### 2 import time 3 def timer(fun):#参数是我们要传入的被装饰函数,记下面的i_can_sleep函数 #1 4 #此处我们需要在函数内部再定义一个内部函数,即嵌套函数 5 def decorator(): 6 start = time.time() 7 fun() #调用被装饰的函数,下面的i_can_sleep() 8 stop = time.time() 9 print('被装饰的函数i_can_sleep程序执行时间为:',stop-start) #给被装饰函数添加计时器功能 10 return decorator 11 @timer #装饰函数 # 2 12 def i_can_sleep():#我们要装饰的函数,即被装饰函数 # 3 13 time.sleep(3) 14 i_can_sleep() #最后一步调用程序 # 4 15 # 其实上面的第四部也可以按下面写,只是装饰器简化下面的步骤。 16 #next = timer(i_can_sleep);next()

执行结果如下:

可以看到执行结果和不使用装饰器一样的。看上去使用装饰器复杂了,实际上,对于大量执行计时器操作,就不用重复定义变量并打印结果了,我们使用装饰器只需改变少量实参即可即可省去重复操作,因为我们把一部分重复操作封装在装饰函数中,@装饰函数名。

带参数的被装饰函数

上面是不带参数的装饰器,下面是带参数的装饰器,注意:1、参数放在内部函数中#1;2、被装饰的函数也要加上参数 看#2;定义被装饰的函数有参数看#3、#4。3、定义被装饰函数时(语法糖下面的函数是被装饰函数),形参名字和上面的嵌套函数可以不一致。
1 print("---------------------------------------------------") 2 # 带参数的装饰器 3 def wai(func): 4 def nei(a,b): #参数放在内部函数中 #1 5 print('start') 6 func(a,b) #被装饰函数调用也要加上参数 #2 7 print('stop') 8 return nei 9 @wai 10 def add(m,n): #加法 #3 11 return print(m+n) #参数名和嵌套函数中的参数名字可以不同。 12 add(4,5) 13 # 可以多次使用语法糖调用装饰器 14 @wai 15 def sub(x,y): #减法 #4 16 return print(x-y) 17 sub(11,4)

执行结果如下:

 

带参数的装饰器(带参数的语法糖)

不改变内部被装饰函数,通过在语法糖(@装饰函数名)后面添加实参和并且在装饰函数再加一层外层函数

1 def add_chars(argv): 2 def wai(func): 3 def nei(a,b): 4 print('开始:%s'%argv) 5 func(a,b) 6 print('结束') 7 return nei 8 return wai 9 @add_chars('加法') #语法糖名字要和多层嵌套函数最外层函数名一致,并且参数对应最外层函数形参 10 def add(m,n): 11 return print(m,'+',n,'=',m+n) 12 add(4,6) 13 @add_chars('减法') # 14 def sub(x,y): #减法 15 return print(x,'-',y,'=',x-y) 16 sub(11,4) 17 # 装饰器带参数;在语法糖上带参数 18 # 可以看到一层嵌套函数,出入的参数满了,我们可以在最外面加一层嵌套函数

执行结果如下:




小白学习笔记,如有理解错误,望批评指正,大佬止步。

转载于:https://www.cnblogs.com/chxb/p/9849348.html

总结

以上是生活随笔为你收集整理的Python小白学习之函数装饰器的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。