python-------装饰器

import time
from functools import wraps

#不想改变原函数的调用方式,但是还想在原来的函数前后添加功能,选择装饰器
#timer就是一个装饰器,
#为了不完全影响原函数引入,warps,

def timer(f):
    @wraps(f)
    def inner(*args,**kwargs):
        starttime = time.time()
        ret = f(*args,**kwargs)
        endtime = time.time()
        print(endtime- starttime)
        return ret
    return inner
@timer              #语法糖 @装饰器函数名 语法等于   func = timer(func)
def func(a):         #被装饰的函数
    '''这是一个函数'''
    time.sleep(1)
    print("43243",a)
    return '试试啊看你'

# func = timer(func)
func('a')
ass = func('a')
print(ass)
print(func.__name__)
print(func.__doc__)

#原则: 开放闭合原则
# 开放:对扩展是开放的
# 封闭:对修改是关闭的

#装饰器模板-------------
def wrapper(f):
    def inner(*args,**kwargs):
        '''在被装饰函数之前要做的事'''
        ret = f(*args,**kwargs)
        '''在被装饰函数之后要做的事'''
        return ret
    return inner

#多层装饰器修饰一个函数

def wrapper1(func):
    def inner1():
        print('wrapper1,before func')
        ret = func()
        print('wrapper1,after func')
        return ret
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2,before func')
        ret = func()
        print('wrapper2,after func')
        return ret
    return inner2

def wrapper3(func):
    def inner3():
        print('wrapper3,before func')
        ret = func()
        print('wrapper3,after func')
        return ret
    return inner3
@wrapper3
@wrapper2
@wrapper1
def f():
     print('hahah ')
     return '哈哈哈'
print(f())

思维导图------执行步骤

原文地址:https://www.cnblogs.com/xiangrikuidebuluo/p/9482195.html