zoukankan      html  css  js  c++  java
  • python中的decorator的作用

    1、概念

    装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码。可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数。在python中,装饰器(decorator)分为函数装饰器类装饰器两种。python中内置的@语言就是为了简化装饰器调用。

    列出几个装饰器函数:

    打印日志:@log

    检测性能:@performance

    数据库事务:@transaction

    URL路由:@post('/register')

    2、使用方法

    (1)无参数decorator

    编写一个@performance,它可以打印出函数调用的时间。

     1 import time
     2 
     3 def performance(f):
     4     def log_time(x):
     5         t1 = time.time()
     6         res = f(x)
     7         t2 = time.time()
     8         print 'call %s() in %fs' %(f.__name__,(t2 - t1))
     9         return res
    10     return log_time
    11 
    12 @performance
    13 def factorial(n):
    14     return reduce(lambda x,y : x*y,range(1,n+1))
    15 
    16 print factorial(10)

    运行结果:

     1 call factorial() in 0.006009s 2 3628800 

    运行原理:

    此时,factorial就作为performance的函数对象,传递给f。当调用factorial(10)的时候也就是调用log_time(10)函数,而在log_time函数内部,又调用了f,这就造成了装饰器的效果。说明f是被装饰函数,而x是被装饰函数的参数。

    (2)带参数decorator

    请给 @performace 增加一个参数,允许传入's'或'ms'。

     1 import time
     2 
     3 def performance(unit):
     4     def perf_decorator(f):
     5         def wrapper(*args, **kw):
     6             t1 = time.time()
     7             r = f(*args, **kw)
     8             t2 = time.time()
     9             t = (t2 - t1)*1000 if unit =='ms' else (t2 - t1)
    10             print 'call %s() in %f %s'%(f.__name__, t, unit)
    11             return r
    12         return wrapper
    13     return perf_decorator
    14 
    15 @performance('ms')  
    16 def factorial(n):
    17     return reduce(lambda x,y: x*y, range(1, n+1))
    18 
    19 print factorial(10)

    运行结果:

     1 call factorial() in 9.381056 ms 2 3628800 

    运行原理:

    它的内部逻辑为factorial=performance('ms')(factorial);

    这里面performance('ms')返回是perf_decorator函数对象,performance('ms')(factorial)其实就是perf_decorator(factorial),然后其余的就和上面是一样的道理了。

    学三境: 一境:昨夜西风凋碧树,独上高楼,望尽天涯路; 二境:衣带渐宽终不悔,为伊消得人憔悴; 三境:众里寻‘它’千百度,蓦然回首,那斯却在,灯火阑珊处。
  • 相关阅读:
    并行取数提升报表性能
    报表选型中那些想不到的坑
    原来报表可以做这么多动态交互效果
    多折线堆叠图如何制作?
    SSIS文档导入DB中文乱码
    Linux-系统日志
    linux-用户和组的管理
    LInux-用户和用户组
    dotcore发布到IIS
    vue发布
  • 原文地址:https://www.cnblogs.com/cpl9412290130/p/9368821.html
Copyright © 2011-2022 走看看