• 装饰器


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

        完全遵循开放封闭原则

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

    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()
  • 相关阅读:
    C语言不进行类型检查 和函数能够不进行前向声明
    EventBus 《二》 Android EventBus的简单使用
    android开发之SnackBar的使用
    iOS语音播放之切换听筒和扬声器
    使用NSURLConnection的网络请求与封装
    Mina Basics 02-基础
    Mina Basics 02-基础
    jquery移除事件,绑定事件,触发事件
    jquery移除事件,绑定事件,触发事件
    jquery移除事件,绑定事件,触发事件
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13528555.html
Copyright © 2020-2023  润新知