• 装饰器——有参装饰器


    有参装饰器:

      是为装饰器提供多样功能选择的实现提供的,实现原理是三层闭包。

    有参装饰器的基本模板:

    def outter(x):
        def  outter1(func):
            def wrapper(*args,*kwargs):
                res = func(*args,**kwargs)
                print(x)
                return res
            return wrapper
          return outter1

    通过第三层进行传值,使得有参装饰器可以使用其他参数,实现其他功能。

    有参装饰器的魔法糖

    @outter('msj')
    #可以被看做
    #f1 = outter1(f1)
    #f1 = wrapper(*args,**kwargs)

    有参装饰器的实例:

    def auth2(engine='file'):
        def auth(func):
            def wrapper(*args,**kwargs):
                if user_info['current_user'] is not None:
                    res=func(*args,**kwargs)
                    return res
                inp_user=input('username>>>: ').strip()
                inp_pwd=input('password>>>: ').strip()
    
                if engine == 'file':
                    print('基于文件的认证')
                    if inp_user == 'egon' and inp_pwd == '123':
                        # 记录登录状态
                        user_info['current_user']=inp_user
    
                        print('login successful')
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('user or password error')
                elif engine == 'mysql':
                    print('基于mysql数据的认证')
                elif engine == 'ldap':
                    print('基于ldap的认证')
                else:
                    print('无法识别认证源')
            return wrapper
        return auth
    
    @auth2(engine='mysql') # @auth ===> index=auth(最原始那个index的内存地址)===》index=wrapper
    def index():
        """这是index功能"""
        print('welcome to index page')
        time.sleep(2)
        return 123
    
    @auth2(engine='file')
    def home(name):
        """这是home功能"""
        print('welcome %s to home page' %name)
        time.sleep(1)
    
    index() #wrapper()
    home('egon')
  • 相关阅读:
    7.1 异常处理结构
    第 7 章 异常处理结构、代码测试与调试
    6.4.2 案例精选
    6.4.1 标准库 os、os.path 与 shutil 简介
    设计模式----装饰模式
    设计模式---单例模式
    设计模式--工厂方法模式
    设计模式-简单工厂模式
    设计模式基础知识
    更改Mysql数据库中的数据出现乱码问题
  • 原文地址:https://www.cnblogs.com/msj513/p/9715127.html
Copyright © 2020-2023  润新知