快速理解Python装饰器

话不多说,直接上重点:

本质:Python函数
功能:可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象
主要需求场景:性能测试、插入日志、事务处理、缓存、权限校验等
优势:可以抽离出大量与函数功能本身无关的雷同代码并继续重用,即:为已经存在的对象添加额外的功能

实验代码:

# 初级版
def use_logging(func):
    def wrapper(*args, **kwargs):
        # logging.warning("{} is running...".format(func.__name__))
        print("{} is running...".format(func.__name__))
        return func(*args, **kwargs)
    return wrapper

def bar():
    print("I am a bar")

# bar = use_logging(bar)
# bar()

# 标准版
@use_logging
def foo():
    print("I am a good boy")
foo()
print("*"*20)

# 带参数装饰器
def use_logging_v2(level):
    def decorate(func):
        def wrapper(*args, **kwargs):
            # logging.warning("{} is running...".format(func.__name__))
            print("{} is running...".format(func.__name__))
            return func(*args, **kwargs)
        return wrapper
    return decorate

@use_logging_v2(level=3)
def brother():
    print("I am a bigger boy")

brother()

# 性能分析监视器
def calc_time(func):
    def wrapper(*args, **kwargs):
        print("This is {} spent time".format(func.__name__), end=':')
        t1 = time.time()
        func(*args, **kwargs)
        t2 = time.time()
        print(t2-t1)
    return wrapper

@calc_time
def worker(steps):
    walks = [1] * steps

@calc_time
def doctor(steps):
    walks = [1 for i in range(steps)]

nums = 100000000
print("*"*20)
worker(nums)
doctor(nums)

结果展示:

时刻记着自己要成为什么样的人!
原文地址:https://www.cnblogs.com/demo-deng/p/14667381.html