python自动化开发-4

装饰器之我见

  python里的装饰器到底是个什么东东,初看起来,可能有的小伙伴会发懵啊,哈哈。

  先来个装饰器的例子瞅瞅:

   

 1  Author:RYB
 2 # __*__coding:utf-8__*__
 3 
 4 '''
 5 dec函数通过用户名和密码实现验证功能。
 6 '''
 7 def dec(func):
 8     def auth():
 9         username = "ryb"
10         password = "123456"
11         user = input("username:").strip()
12         passwd = input("password:").strip()
13         if user == username and passwd == password:
14             msg = print("验证通过,欢迎来到京东商城!")
15         elif user == username and passwd != password:
16             msg = print("密码不正确,请输入正确的密码!")
17         elif user != username and passwd != password:
18             msg = print("用户名和密码均不正确,请输入正确的用户名和密码!")
19         else:
20             msg = print("用户名不正确,请输入正确的用户名!")
21     return auth
22 
23 #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
24 @dec
25 def jd():
26     print("welcome to jd!")
27 
28 #执行jd函数
29 jd()
View Code

   上面装饰器例子(函数版):可读性更强一些哈哈

    

 1 # Author:RYB
 2 # __*__coding:utf-8__*__
 3 
 4 #用户名和密码都正确
 5 def user_passd_right():
 6     msg = print("验证通过,欢迎来到京东商城!")
 7 
 8 
 9 #用户名正确,密码不正确
10 def useright_passd():
11     print("密码不正确,请输入正确的密码!")
12 
13 #用户不正确,密码正确
14 def user_passdright():
15     print("用户名不正确,请输入正确的用户名!")
16 
17 #用户名和密码都不正确
18 def user_passd():
19     print("用户名和密码均不正确,请输入正确的用户名和密码!")
20 
21 '''
22 dec函数通过用户名和密码实现验证功能。
23 '''
24 def dec(func):
25     def auth():
26         username = "ryb"
27         password = "123456"
28         user = input("username:").strip()
29         passwd = input("password:").strip()
30         if user == username and passwd == password:
31             user_passd_right()
32             func()
33         elif user == username and passwd != password:
34             useright_passd()
35         elif user != username and passwd != password:
36            user_passd()
37         else:
38             user_passdright()
39     return auth
40 
41 #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
42 @dec
43 def jd():
44     print("welcome to jd!")
45 
46 #执行jd函数
47 jd()
View Code

     

那么到底装饰器是个什么东西呢?我想,通过上面的例子说的通俗一些,伙伴们多少知道一些吧。装饰器其实也是一个函数,一个用来包装函数的函数,装饰即修饰,意指为其他函数添加新功能。

  装饰器定义:本质就是函数,功能是为其他函数添加新功能

  装饰器需要遵循的原则:

    1.不修改被装饰函数的源代码(开放封闭原则);

    2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。

  装饰器知识储备:装饰器=高阶函数+函数嵌套+闭包

  装饰器的例子1:

    

 1 # Author:RYB
 2 # __*__coding:utf-8__*__
 3 import time
 4 
 5 def timer(func):
 6     def wrapper():
 7         start_time = time.time()
 8         func()
 9         stop_time = time.time()
10         print('run time is %s' %(stop_time-start_time))
11     return wrapper
12 #@timer等价index=timer(index)
13 @timer
14 def index():
15     print("in the index")
16 index()
View Code

 运行结果如下:  

  in the index
  run time is 0.0

 

  装饰器的例子2:有参数的

    

 1 # Author:RYB
 2 # __*__coding:utf-8__*__
 3 
 4 import time
 5 def timer(func):
 6     def wrapper(*args,**kwargs):
 7         start_time = time.time()
 8         res=func(*args,**kwargs)
 9         stop_time = time.time()
10         print('run time is %s' %(stop_time-start_time))
11         return res
12     return wrapper
13 
14 #@timer等价index=timer(index)
15 @timer
16 def index(msg):
17     print("in the index:",msg)
18     return 1
19 res=index("hello myworld")
20 print(res)
View Code

运行结果:  

  in the index: hello myworld
  run time is 0.0
  1

posted on 2017-02-13 11:54  永远的大空翼  阅读(201)  评论(0编辑  收藏  举报