python-装饰器

1.什么是装饰器

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,

增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景

2.装饰器的形成过程

import time

def func1():
    print('in func1')

def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

func1 = timer(func1)
func1()

但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样

还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方

法,python给你提供了,那就是语法糖。

#装饰器-语法糖
import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): print('in func1') func1()

装饰器-带参数的语法糖

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

能hole住所有参数的装饰器

import time

def timmerout(flag1):  # flag1 =flag
    def timmer(f):
        def inner(*args,**kwargs):
            if flag1:
                start_time = time.time()
                ret = f(*args,**kwargs)
                end_time = time.time()
                print('此函数的执行效率%s' % (end_time - start_time))
                return ret
            else:
                ret = f(*args, **kwargs)
                return ret
        return inner
    return timmer


flag = False
@timmerout('alex','nan',1000)  # 1,将@ 与函数分开@     timmerout(flag)  返回了timmer 2,将@timmer结合。
def func1():
    time.sleep(0.3)
    print('非常复杂......')
    return 666

@timmerout(flag)
def func2():
    time.sleep(0.3)
    print('非常复杂......')
    return 666


@timmerout(flag)
def func3():
    time.sleep(0.1)
    print('非常复杂......')
    return 666
1,将@ 与函数分开@     timmerout(flag)  返回了timmer
2,将@timmer结合



def timmerout(flag1):  # flag1 =flag
    def timmer(f):
        def inner(*args,**kwargs):
            if flag1:
                start_time = time.time()
                ret = f(*args,**kwargs)
                end_time = time.time()
                print('此函数的执行效率%s' % (end_time - start_time))
                return ret
            else:
                ret = f(*args, **kwargs)
                return ret
        return inner
    return timmer

@timmerout('京东')  # 1,将@ 与函数分开@     timmerout(flag)  返回了timmer 2,将@timmer结合。
def JDshop():
    time.sleep(0.3)
    print('非常复杂......')
    return 666

@timmerout('京东')
def JD():
    time.sleep(0.3)
    print('非常复杂......')
    return 666


@timmerout('淘宝')
def taobao():
    time.sleep(0.1)
    print('非常复杂......')
    return 666

@timmerout('淘宝')
def taobaoshop():
    time.sleep(0.1)
    print('非常复杂......')
    return 666

func1()
func2()
func3()

  

 

 

 

 

posted @ 2018-06-07 16:02  辛立宝  阅读(132)  评论(0编辑  收藏  举报