• 关于python中的装饰器(Decorator)的讲解


    #最近在网上看代码时,出现了@???的代码,看了好久也不知道是什么意思,经过了解原来是装饰器,我给大家举个例子讲解一下,帮助大家快速理解:

    ##大家在写函数的时候,可能会想测试这个函数的运行时间,如果每个函数都加一个类似于:

    1. start=time.time()
    2. 函数主体
    3. over=time.time()
    4. Time=over-start
    5. print(Time)
    1. def haha():
    2. start=time.time()
    3. for i in range(1200):
    4. if i%2==0:
    5. print('这是个偶数:',i)
    6. over=time.time()
    7. print("总共花费的时间:",over-start)
    8. haha()

    这样函数的可读性也不高,如果要测试好几个函数还会大量浪费时间。

    下面引入装饰器:

    1简单的装饰器操作:

    (先定义一个函数1(里面传递一个参数),然后在函数1里面再定义一个函数2负责计算时间,并在时间中间调用定义函数1的参数,然后返回这个函数2):

    !!!当我们想调用装饰器时,只需@函数1的名字,放在想要使用的函数前面即可。

    1. import time
    2. def decorator(fun):
    3. def wrapper():
    4. t1=time.time()
    5. fun()
    6. t2=time.time()
    7. print('总共花费的时间:',t2-t1)
    8. return wrapper
    9. @decorator
    10. def haha():
    11. #start=time.time()
    12. for i in range(1200):
    13. if i%2==0:
    14. print('这是个偶数:',i)
    15. #over=time.time()
    16. #print("总共花费的时间:",over-start)
    17. haha()

    2,装饰器升级版(如果我们想套用的函数中,具有返回对应的值这个功能共时使用):

    例如这个函数:

    1. def haha():
    2. a=0
    3. #start=time.time()
    4. for i in range(1200):
    5. if i%2==0:
    6. print('这是个偶数:',i)
    7. a=a+i
    8. return a

    #我们如果还用1中的装饰器就不能返回对应的值,这就需要改动装饰器:

    (在装饰器中也要把函数中定义参数的返回值给表示出来,并且利用return 给返回值,输出出来)

    1. import time
    2. def decorator1(fun):
    3. def wrapper2():
    4. t1=time.time()
    5. result=fun()
    6. t2=time.time()
    7. print('总共花费的时间:',t2-t1)
    8. return result
    9. return wrapper2
    10. @decorator1
    11. def haha():
    12. a=0
    13. #start=time.time()
    14. for i in range(1200):
    15. if i%2==0:
    16. print('这是个偶数:',i)
    17. a=a+i
    18. return a
    19. #over=time.time()
    20. #print("总共花费的时间:",over-start)
    21. aaa=haha()
    22. print(aaa)

    可能有同学会问,为什么后面要用到aaa=haha(),

    这是因为我们要接受返回值result,并将其用print()打印出来。

    3,装饰器的升级升级版(当我们需要使用的函数haha中,不但有返回值,还有传入的参数时使用。)

    (只需要在我们的函数2和调用的函数1中的参数()里面加上关键字传参*args,即可)

    1. import time
    2. def decorator1(fun):
    3. def wrapper2(*args):
    4. t1=time.time()
    5. result=fun(*args)
    6. t2=time.time()
    7. print('总共花费的时间:',t2-t1)
    8. return result
    9. return wrapper2
    10. @decorator1
    11. def haha(key):
    12. a=0
    13. #start=time.time()
    14. for i in range(key):
    15. if i%2==0:
    16. print('这是个偶数:',i)
    17. a=a+i
    18. return a
    19. #over=time.time()
    20. #print("总共花费的时间:",over-start)
    21. aaa=haha(1200)
    22. print(aaa)

    可不要忘了,调用函数haha时要传入参数哦。

  • 相关阅读:
    网络安全防御体系中网络安全检查设备
    基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表
    Centos / Ubuntu 自启动服务 - 测试记录 - 杂记
    SortedSet 和 List 异同点
    【自动驾驶多传感器融合+多算法融合】
    谷歌研究员走火入魔事件曝光:认为AI已具备人格,被罚带薪休假,聊天记录让网友San值狂掉...
    排序——手撕快排
    玩转Mysql系列 - 第22篇:mysql索引原理详解
    智慧排水监测系统,科技助力城市排水治理
    JVM内存和垃圾回收-06.本地方法栈
  • 原文地址:https://blog.csdn.net/Superman980527/article/details/127593379