day④:装饰器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day④:装饰器相关的知识,希望对你有一定的参考价值。

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④:装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python使用上下文对代码片段进行计时,非装饰器

装饰器-Day4

day04-装饰器

Day17 装饰器

021day--python装饰器

Day 19 函数之闭包装饰器