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()
上面装饰器例子(函数版):可读性更强一些哈哈
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()
那么到底装饰器是个什么东西呢?我想,通过上面的例子说的通俗一些,伙伴们多少知道一些吧。装饰器其实也是一个函数,一个用来包装函数的函数,装饰即修饰,意指为其他函数添加新功能。
装饰器定义:本质就是函数,功能是为其他函数添加新功能
装饰器需要遵循的原则:
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()
运行结果如下:
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)
运行结果:
in the index: hello myworld
run time is 0.0
1
你不向我走来,我便向你走去。