装饰器

装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。

    完全遵循开放封闭原则

    装饰器就是一个函数,本质是:闭包

python做了一个优化,提出了一个语法糖的概念

标准形式的装饰器:

  1.语法糖概念 2. 原函数有返回值 3. 原函数有单个或多个参数

import time


def func_timer(f):   # func_timer装饰器  # f:被装饰的函数
    def inner(*args, **kwargs):  # *:聚合

        start_time = time.time()

        '''之前是访问被装饰函数之前的操作,功能'''
        ret = f(*args, **kwargs) # *:打散  # 如果原函数有返回值,要在这里接收它
        '''下面是这里是访问被装饰函数之后的操作,功能'''

        end_time = time.time()
        print(f'测试函数:{f},耗时:{end_time - start_time}')

        return ret

    return inner


@func_timer   # ==> index = func_timer(index) # 这里实际上是读取该行与下一行
def index(name):  # 原函数
    """
    这里有很多代码
    """
    time.sleep(2) # 模拟的网络延迟或者执行代码耗费的时间
    print(f'欢迎{name}登录博客园!')

    return 666

ret1 = index('天帝') # inner('天帝')  没有改变原函数调用方式和代码,并为其增加了函数执行效率的测试功能
print(ret1)


@func_timer
def dary(age, name):
    """
    这里有很多代码
    """
    time.sleep(3)
    print(f'{age}的{name}来到了日记界面')

dary(18, 'LGQ')

 带参数的装饰器:

import time

def logger(n):

    def deco_func(f):
        def inner(*args, **kwargs):

            ret = f(*args, **kwargs)
            with open(f'{n}.txt', encoding='utf-8', mode='a') as f1:
                t = time.strftime('%Y %m %d %H-%M-%S', time.localtime())
                msg = f'{t}调用了{f.__name__}
'
                f1.write(msg)

            return ret

        return inner

    return deco_func


"""
带参数的装饰器就是在原本的装饰器基础上在最外层套一层函数,然后return原本装饰器的函数名
1.ret = logger('auth_Log')
2.ret = deco_func
3.@ret 即 @deco_func
4.login = deco_func(login)
5.login = inner
6.login() 即 inner()
"""
@logger('auth_log')
def login():
    print("登录逻辑")


@logger('auth_log')
def register():
    print("注册逻辑")


@logger
def show_goods():
    print("查看所有的商品信息")


@logger
def add_goods():
    print("商品加入购物车")


login()
register()
原文地址:https://www.cnblogs.com/GOD-L/p/13528555.html