Python基础—装饰器(Day11)

装饰器

1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能。

简单版装饰器
import
time def func1(): print('执行速度') def timmer(f): start_time=time.time() f() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s'% (end_time-start_time)) f1=func1 func1=timmer func1(f1)
import time
def timmer1(f): #f接收的是@timmer下面原函数的函数名func1
    def inner():
        f()
        start_time=time.time()
        time.sleep(0.3)
        end_time=time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
    return inner

@timmer1
def func1():
    print('测试速度')

func1()

执行结果:
测试速度
此函数的执行效率0.30037736892700195

 2.被装饰函数带参数的装饰器

# import time
# def timmer(f):#f=func1=inner
#     def inner(*args,**kwargs):
#         start_time=time.time()
#         f(*args,**kwargs)  #func1((*args,**kwargs))
#         time.sleep(0.3)
#         end_time=time.time()
#         print('此函数的执行效率%s'% (end_time-start_time))
#     return inner
# @timmer
# def func1(a,b,c,d): #timmer(func1)
#     print(a,b,c,d)
#     print('测试效率')
# func1(1,2,3,4)

3.装饰器模版

def wrapper(func):
    def inner(*args,**kwargs):
        ret=func(*args,**kwargs)
        return ret
    return inner

@wrapper
def func(a,b):
    print(666)
func(1,2,3)

 4.带参数的装饰器

import time
def timmer(*args,**kwargs):
    def wrapper(f):
        def inner(*args,**kwargs):
            if flag:
                start_time=time.time()
                ret=f(*args,**kwargs)
                time.sleep(0.3)
                end_time=time.time()
                print('此函数的执行效率%f' %(end_time-start_time))
            else:
                ret=f(*args,**kwargs)
            return ret
        return inner
    return wrapper
flag=True  #flag=False 关掉装饰器
@timmer(flag) # 两步:1.把timmer(flag)当成一个普通话函数传给def timmer(),返回wrapper 2.变成@wrapper装饰器
def func1():
    print(666)
func1()

执行结果:
666
此函数的执行效率0.300240

 5.多个装饰器

def wrapper1(func):# func=f=inner1
    def inner1():
        print('wrapper1,before func') #2
        func()
        print('wrapper1,after func') #3
    return inner1
def wrapper2(func): # func=inner1=inner2
    def inner2():
        print('wrapper2,before func') #1
        func()
        print('wrapper2,after func') #4
    return inner2
@wrapper2 #  f = wrapper2(f)  里面的f==inner1  外面的f == inner2
@wrapper1 # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
def f():# f=inner1
    print('in f')
f() #f=inner1=inner2

执行结果:
wrapper2,before func
wrapper1,before func
in f
wrapper1,after func
wrapper2,after func
原文地址:https://www.cnblogs.com/facestore/p/8678840.html