十三:装饰器函数

一:装饰器的作用就是在原来函数的基础上增加了一些扩展的功能,因为我们开始写的函数已经投入应用了,所以不能对原函数进行修改,也不能修改对它的调用方式,即“开放封闭原则”,封闭:就是说不能对已经使用的函数进行任何修改;开放:就是说虽然不能对原函数进行修改,但是我们可以进行扩展,以增加新的功能。当然我们也可以在执行某些函数之前需要执行其它固定函数,也可以作为装饰器函数的应用,比如登陆操作,无论进入那个功能函数,都需要提前进行登陆,所以可以把登陆功能作为其它功能函数的装饰器来用。

example 1:需求:对已经投入使用的函数 foo() 增加了一个函数运行时间的功能,并且不能改变其原来的调用方式。

复制代码
 1 # 需求:在不改变调用方式的情况下,给要求的函数加上计算执行时间的功能
 2 
 3 import time
 4 
 5 def show_time(f):
 6     def inner():
 7         start = time.time()
 8         f()
 9         end = time.time()
10         print('spend %s' % (end - start) )
11     return inner
12 
13 @show_time    # foo = show_time(foo)
14 def foo():
15     print('foo...')
16     time.sleep(2)
17 
18 foo()  # 仍以原来的方式进行调用
Decorator
复制代码

 

example 2:对功能函数和装饰器函数加入参数,对装饰器加参数,我们需要再嵌套一层循环,这样就可以引入一个参数。

复制代码
 1 # 需求:在不改变调用方式的情况下,给要求的函数加上计算执行时间的功能
 2 
 3 import time
 4 
 5 def logger(flag = 'Flase'):  # 装饰器函数传入参数
 6     def show_time(f):    # 不能直接在这个函数中加入参数,因为装饰器格式是定好的
 7         def inner(x,y):    # 给功能函数加参数要传入形参
 8             start = time.time()
 9             f(x,y)         # 对 f 的访问为闭包,给功能函数加参数要传入形参
10             end = time.time()
11             print('spend %s' % (end - start) )
12             if flag == 'true':
13                 print('日志记录')
14         return inner
15     return show_time      #需要多加一个返回,返回值为嵌套的最外层函数
16 
17 @logger('true')    #  == @show_time     add = show_time(add)
18 def add(x,y):
19     time.sleep(2)
20     print(x + y)
21 
22 add(1,2)
装饰器加参数
复制代码

 

example 3:如果装饰器函数不需要参数的话,那么只需要给功能函数加如参数就可以了。

复制代码
 1 import time
 2 
 3 def show_time(f):
 4     def inner(x,y):   # 给功能函数加参数要传入形参
 5         start = time.time()
 6         f(x,y)         # 对 f 的访问为闭包,给功能函数加参数要传入形参
 7         time.sleep(1)
 8         end = time.time()
 9         print('spend %s' % (end - start) )
10     return inner
11 
12 @show_time   # foo = show_time(foo)
13 def foo(x,y):
14     print('result:',x + y)
15 
16 foo(1,2)
只给功能函数加参数
复制代码

 

posted on   爱笑的张飞  阅读(154)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示