函数装饰器

1. 装饰器

# 无参装饰器,这里的参数是指在使用装饰器的时候的参数
import functools
def wrapper(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return res
    return inner

# 无参装饰器的使用
@wrapper
def func():
    pass


# 有参装饰器
def auth(driver):
    def wrapper(func):
        ...
    return wrapper


# 有参装饰器的使用
@auth(driver='file')
def func():
    pass

2. 装饰器推导

import time


def func():
    pass


# 步骤一:将计时器功能封装成一个函数
def inner(func):
    start_time = time.time()
    res = func()
    end_time = time.time()
    print(end_time - start_time)
    return res

# 此时调用方式(inner(函数名)),改变了函数名()的调用放啊


# 步骤二:在函数外面再包一层函数,返回一个函数名,用此函数名加括号来调用函数。函数的参数在内层函数传入
def wrapper(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return res
    return inner


# 此时函数的调用方式分两步
func = wrapper(func)  # 步骤一
func()  # 步骤二


# 此时如果调用方法
a = func.__doc__  # 是inner的注释
b = func.__name__  # 方法名是inner
# 解决方法,加一个functools.wraps(func)

# 最终写法
import functools
def wrapper(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return res
    return inner



# 语法糖,写在函数上方,自动调用func = wrapper(func)
@wrapper
def func():
    pass
原文地址:https://www.cnblogs.com/JackShi/p/13152543.html