Python之第三十五天的努力--带参数的装饰器

带参数的装饰器

  • 版本一:写了很多函数,添加日志: 在 什么时间 调用了什么函数

    import time
    
    def log(func):
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)
            print(f'{time.strftime("%Y-%m-%d %H:%M:%S")} 执行了{func.__name__}')
            return ret
        return inner
    
    @log
    def login():
        print('登录')
    
    @log
    def register():
        print('注册')
    
    @log
    def show_goods():
        print('查看所有商品信息')
    
    @log
    def add_goods():
        print('商品加入购物车')
    
    login()     # 2020-07-20 13:14:25 执行了login
    
  • 版本二:登录和注册的信息 写到 auth.log文件里,所有的购物信息 写到operate.log文件里

    import time
    
    def log(func):
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)
            if func.__name__ == 'login' or func.__name__ == 'register':
                with open('auth.log',encoding='utf-8',mode='a')as f1:
                    msg = f'{time.strftime("%Y-%m-%d %H:%M:%S")} 执行了{func.__name__}'
                    f1.write(msg)
            else:
                with open('operate.log',encoding='utf-8',mode='a')as f2:
                    msg = f'{time.strftime("%Y-%m-%d %H:%M:%S")} 执行了{func.__name__}'
                    f2.write(msg)
            return ret
        return inner
    
    @log
    def login():
        print('登录')
    
    @log
    def register():
        print('注册')
    
    @log
    def show_goods():
        print('查看所有商品信息')
    
    @log
    def add_goods():
        print('商品加入购物车')
    
    login()
    add_goods()
    
  • 版本三:

    import time
    
    def logger(path):
        def log(func):
            def inner(*args,**kwargs):
                ret = func(*args,**kwargs)
                with open(path,encoding='utf-8',mode='a')as f1:
                    msg = f'{time.strftime("%Y-%m-%d %H:%M:%S")} 执行了{func.__name__}\n'
                    f1.write(msg)
                return ret
            return inner
        return log
    
    @logger('auth.log')
    def login():
        print('登录')
    # @logger('auth.log') ---> ret = logger('auth.log')
    # ---> @ret   ---> login = ret(login)
    
    # @logger('auth.log') ---> logger('auth.log')返回一个log --->@log
    
    @logger('auth.log')
    def register():
        print('注册')
    
    @logger('operate.log')
    def show_goods():
        print('查看所有商品信息')
    
    @logger('operate.log')
    def add_goods():
        print('商品加入购物车')
    
    login()
    add_goods()
    

    image-20200720134611896

  • 精髓:

    # 原本有个装饰器wrapper
    # def wrapper(func):
    #     def inner():
    #         pass
    #     return inner
    
    # 需要
    # @wrapper
    # def func():
    #     pass
    # ----->
    # @xxx('参数')
    # def func():
    #   pass
    
    # 则,把原来的装饰器改为: 
    # def xxx(*args):
    #   def wrapper(func):
    #     def inner():
    #         pass
    #     return inner
    #   return wrapper
    
posted @ 2020-07-20 14:04  ET-珩  阅读(111)  评论(0)    收藏  举报