jQuery火箭图标返回顶部代码

Python之旅:装饰器

装饰器就是闭包函数的一种应用场景

一、为何要用装饰器#

 

开放封闭原则:软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
       也就是说我们必须找到一种解决方案:能够在不修该一个功能源代码以及调用方式的前提下,为其加上新功能
       上述总结,原则如下:
                1、不修改源代码
                2、不修改调用方式
        目的:
            在遵循1和2原则的基础上扩展新功能

 

二、什么是装饰器#

器指的工具,装饰指的是为被装饰对象添加新功能


完整含义:
        装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

        装饰器与被装饰的对象均可以是任意可调用的对象

 

        装饰器=》函数

        被装饰的对象=》函数

 

三、无参装饰器#

#无参装饰器模板
def outer(func):
    def inner(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return inner
复制代码
 1 ###现在我们要查看指令执行的时间
 2 #以前实现的方式
 3 #违反了装饰器的原则---》不修改源代码
 4 import time       #导入时间模块
 5 
 6 def index():
 7     start_time=time.time()           #现在时间
 8     time.sleep(3)              #暂停3s
 9     print('welcome to index page')    
10     stop_time=time.time()          #现在的时间(time.sleep与print执行完后的时间)
11     print('run time is %s' %(stop_time-start_time))
12 
13 index()  #调用函数
14 
15 #修订1
16 #没有违背原则,但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复
17 import time
18 
19 def index():
20     time.sleep(3)
21     print('welcome to index page')
22 
23 start_time=time.time()
24 index()
25 stop_time = time.time()
26 print('run time is %s' % (stop_time - start_time))
27 
28 #但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复
29 
30 import time
31 
32 def index():
33     time.sleep(3)
34     print('welcome to index page')
35 
36 def home(name):
37     time.sleep(5)
38     print('welcome %s to home page' %name)
39 
40 start_time=time.time()  #代码重复
41 index()
42 stop_time = time.time()      #代码重复
43 print('run time is %s' % (stop_time - start_time))  #代码重复
44 
45 start_time=time.time()
46 home('egon')
47 stop_time = time.time()
48 print('run time is %s' % (stop_time - start_time))
49 
50 #修订2
51 
52 # 修改了原函数的调用方式
53 
54 import time
55 
56 def index():
57     time.sleep(3)
58     print('welcome to index page')
59 
60 def home(name):
61     time.sleep(5)
62     print('welcome %s to home page' %name)
63 
64 def wrapper(func): #func=index
65     start_time=time.time()
66     func() #index()
67     stop_time = time.time()
68     print('run time is %s' % (stop_time - start_time))
69 
70 
71 wrapper(index) # 修改了原函数的调用方式
72 
73 #修订3
74 
75 import time
76 
77 def index():
78     time.sleep(3)
79     print('welcome to index page')
80 
81 def outter(func): #func=最原始的index
82     # func=最原始的index
83     def wrapper():
84         start_time=time.time()
85         func()
86         stop_time=time.time()
87         print(stop_time-start_time)
88     return wrapper
89 
90 
91 index=outter(index) # 新的index=wrapper
92 
93 index() #wrapper()
无参装饰器
复制代码

四、无参装饰器升级版#

复制代码
import time

def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

def home(name):
    time.sleep(2)
    print('welcome %s to home page' %name)

#==============装饰器
def timmer(func):
    #func=最原始的home
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs) #调用最原始的home
        stop_time=time.time()
        print(stop_time-start_time)
        return res
    return wrapper


index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ==========================================

# res=index() #res=wrapper()
# print(res)

home(name='egon') #wrapper('egon')
index() #wrapper()
复制代码

五、装饰器语法#

复制代码
#就是一个@调用某个装饰器

import
time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(stop_time-start_time) return res return wrapper @timmer #index=timmer(index) #语法调用方式 def index(): time.sleep(1) print('welcome to index page') return 122 @timmer # home=timmer(home) #语法调用方式 def home(name): time.sleep(2) print('welcome %s to home page' %name) # index() home('egon')
复制代码

 

六、认证装饰器实现#

 #

七、叠加多个装饰器#

 #

 #

八、有参数装饰器#

 

posted @   墨颜丶  阅读(193)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示
CONTENTS