码迷,mamicode.com
首页 > 其他好文 > 详细

day④:装饰器

时间:2016-01-30 17:53:38      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

start
py3

一.装饰器基本原理与实现
例子1:
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. print("passed user verification...")
  6. return func #返回func,即是tv的内存地址
  7. def tv():
  8. print("welcome [%s] to home page")
  9. tv = login(tv) #tv是变量
  10. tv() #tv加上括号,就调用tv函数
  11. 结果:
  12. passed user verification...
  13. welcome [%s] to home page


例子1.1 ,加上参数和用语法糖:
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. print("passed user verification...")
  6. return func #返回func,即是tv的内存地址
  7. @login #tv=login(tv)
  8. def tv(name):
  9. print("welcome [%s] to home page" %name)
  10. tv("yaobin") #tv加上括号,就调用tv函数
  11. 结果:
  12. passed user verification...
  13. welcome [yaobin] to home page


例子1.2,小问题,还没调用就执行验证了:
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. print("passed user verification...")
  6. return func #返回func,即是tv的内存地址
  7. @login #tv=login(tv)
  8. def tv(name):
  9. print("welcome [%s] to home page" %name)
  10. 结果:
  11. passed user verification...
  12. #我都还没有tv("yaobin"),就已经执行了验证



二.装饰器实现
为了解决上面的问题,加上inner():
例子1:
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. def inner(arg):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. func(arg) #tv
  9. return inner #login 返回inner的内存地址
  10. @login #tv=login(tv)
  11. def tv(name):
  12. print("welcome [%s] to home page" %name)
  13. #tv("yaobin") #这里加上括号,相当于调用inner!而且有参数,所有inner也要有参数,func也要有参数
  14. ①结果:
  15. ②把#tv("yaobin")打开,结果:
  16. passed user verification...
  17. welcome [yaobin] to home page
#程序一执行,就执行@login,还没调用就执行了,所以加上inner().返回inner的内存地址,解决还没调用就执行@login。




三.被装饰的函数如果有参数
(1).2个参数
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv or moive
  5. def inner(arg1,arg2):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. func(arg1,arg2) #tv or moive
  9. return inner #login 返回inner的内存地址
  10. @login
  11. def moive(name,anything): #moive=moive(tv)
  12. print("welcome [%s] to home page" %name)
  13. @login #tv=login(tv)
  14. def tv(name,passwd):
  15. print("welcome [%s] to home page" %name)
  16. print("my passwd is :[%s] " %passwd)
  17. tv("yaobin","123456")
  18. print("")
  19. moive("hy","anything")
  20. #结果
  21. passed user verification...
  22. welcome [yaobin] to home page
  23. my passwd is :[123456]
  24. passed user verification...
  25. welcome [hy] to home page


(2).装饰具有处理n个参数的函数的装饰器
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv
  5. def inner(*args,**kwargs):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. func(*args,**kwargs) #tv or moive
  9. return inner #login 返回inner的内存地址
  10. @login #moive=moive(tv)
  11. def moive(name,passwd=123456): #passwd有默认参数
  12. print("welcome [%s] to home page" %name)
  13. print("my passwd is :[%s] " %passwd)
  14. @login #tv=login(tv)
  15. def tv(name,passwd=456789): #passwd有默认参数
  16. print("welcome [%s] to home page" %name)
  17. print("my passwd is :[%s] " %passwd)
  18. #①自定义参数
  19. moive("hy","one")
  20. tv("yaobin","two")
  21. print("")
  22. #②使用默认参数
  23. moive("hy")
  24. tv("yaobin")
  25. 结果:
  26. passed user verification...
  27. welcome [hy] to home page
  28. my passwd is :[one]
  29. passed user verification...
  30. welcome [yaobin] to home page
  31. my passwd is :[two]
  32. passed user verification...
  33. welcome [hy] to home page
  34. my passwd is :[123456]
  35. passed user verification...
  36. welcome [yaobin] to home page
  37. my passwd is :[456789]


四.被装饰的函数返回值
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #py3
  4. def login(func): #func=tv or moive
  5. def inner(*args,**kwargs):
  6. print("passed user verification...")
  7. #return func #这里不用return了,应该是执行!
  8. return func(*args,**kwargs) #tv or moive ##这里要return,不然没有返回值
  9. return inner #login 返回inner的内存地址
  10. @login #moive=moive(tv)
  11. def moive(name,passwd=123456): #passwd有默认参数
  12. print("welcome [%s] to home page" %name)
  13. print("my passwd is :[%s] " %passwd)
  14. @login #tv=login(tv)
  15. def tv(name,passwd=456789): #passwd有默认参数
  16. print("welcome [%s] to home page" %name)
  17. print("my passwd is :[%s] " %passwd)
  18. return name,passwd
  19. moive("hy") #moive()加上括号,相当于调用inner!而且有参数,所有inner也要有参数,func也要有参数
  20. print("")
  21. t= tv("yaobin","my passwd haha") #tv()加上括号,相当于调用inner!而且有参数,所有inner也要有参数,func也要有参数
  22. print(t) #看返回值
  23. 结果:
  24. passed user verification...
  25. welcome [hy] to home page
  26. my passwd is :[123456]
  27. passed user verification...
  28. welcome [yaobin] to home page
  29. my passwd is :[my passwd haha]
  30. (‘yaobin‘, ‘my passwd haha‘)
















end




day④:装饰器

标签:

原文地址:http://www.cnblogs.com/binhy0428/p/5170956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!