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 @ 2018-03-29 22:53  墨颜丶  阅读(196)  评论(0)    收藏  举报