zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    分享一个js方法
    微信小程序中如何使用setData修改数组或对象中的某一参数
    微信小程序实现图片上传功能
    微信小程序图片上传放大预览删除代码
    小程序单张图片 和 九宫格图片上传、预览、删除示例
    微信小程序多图上传/朋友圈传图效果【附完整源码】
    shell 和awk性能对比
    超实用的8个Linux命令行性能监测工具
    storm分组模式
    Python程序的执行原理(转)
  • 原文地址:https://www.cnblogs.com/binhy0428/p/5170956.html
Copyright © 2011-2022 走看看