其他分享
首页 > 其他分享> > 十二、装饰器 1.装饰器

十二、装饰器 1.装饰器

作者:互联网

装饰器

装饰器 decorator
    在不改变原函数代码,且保持原函数调用方法不变的情况下,给原函数增加新的功能(或给类增加新的属性和方法)

核心思想
    用一个函数/类去装饰原函数/类,创建出一个新的函数/类

语法
    存在闭包和待修饰的函数
    在定义原函数时使用 @ 引用装饰器函数,装饰器会把原函数作为参数传递到装饰器函数中,@ 符号也叫语法糖

应用场景
    引入日志、统计函数执行时间、权限校验、缓存、执行函数前的初始化等
    函数装饰器、类装饰器、类方法装饰器都是用来装饰函数的

本质:函数外无法直接调用内层函数
      通过闭包,让原函数变量名引用内层函数,内层函数中接收的变量名引用原函数,此时原函数调用方式不变,内层函数中又保存了原函数

# 装饰器的底层实现
# 闭包函数
def outer(func):
    # 内层函数
    def inner():
        print('this is inner1')
        # 此时func指向old()
        func()
        print('this is inner2')
    return inner

# 原函数
def old():
    print('this is old func')

# 新的old()
# 此时old指向inner(),调用 old() 等同于调用 inner()
old = outer(old)
old()


# 装饰器语法
# 此处把outer作为装饰器
@outer    # 等同于 old = outer(old) ,此时无法再向 outer 传递其他参数
def old():
    print('this is old func')
old()



this is inner1
this is old func
this is inner2
this is inner1
this is old func
this is inner2

# 使用装饰器统计函数执行时间
# 定义装饰器函数
def runtime(f):
    # 内层函数
    def inner():
        time_start = time.perf_counter()
        f()
        time_end = time.perf_counter() - time_start
        print(time_end)
    return inner

# 需要使用装饰器的原函数
@runtime
def run():
    for i in range(5):
        print(i,end=' ')
        time.sleep(0.5)
run()


0 1 2 3 4 2.519227228

标签:old,函数,十二,原函数,func,time,装饰
来源: https://www.cnblogs.com/HyeJeong/p/15690871.html