zoukankan      html  css  js  c++  java
  • 装饰器进阶

    带参数的装饰器

    def login(a, b):
        print(a, b)
        def wrapper(f):
            def inner(*args, **kwargs):
                ret = f(*args, **kwargs)
                return ret
            return inner
        return wrapper
    
    @login(1,2)
    def func1():
        print(111)
    
    func1()


    举例: 500个函数加上装饰器,再去掉,在加 ,再去.....疯了
    def login(a):
        def wrapper(f):
            def inner(*args, **kwargs):
                if a:
                    if login_status['status']:
                        ret = f(*args, **kwargs)
                        return ret
                    else:
                        print('请先登录')
                        username = input('请输入用户名').strip()
                        password = input('请输入密码').strip()
                        if username == '二狗' and password == '123':
                            login_status['username'] = username
                            login_status['status'] = True
                            ret = f(*args, **kwargs)
                            return ret
                else:
                    ret = f(*args, **kwargs)
                    return ret
            return inner
        return wrapper
    
    flag = True   #设置为False表示不验证,为True表示需要验证。只需要改动这一个就可以了。
    
    @login(flag)
    def func1():
        print(111)
    @login(flag)
    def func2():
        print(12)
    @login(flag)
    def func3():
        print(131)
    
    func1()

     

     现在有一个京东超市和京东首页,天猫超市和天猫首页,4个函数,做一个认证,如果你要登录京东的就输入京东的账号和密码, 登录天猫的就输入天猫的账号和密码。你现在就得弄两套密码,两套密码你得走同一个装饰器,此时你就得用到带参数的装饰器。

    既然是要做登录认证,你就得让他输入账号和密码,但是你用的是一个装饰器,我的需求是,如果你要登录京东的就输入京东的账号和密码, 登录天猫的就输入天猫的账号和密码,你要不会带参数的装饰器,这个不好整。

    login_status = {
        'username': None,
        'status': False,
    }
    
    
    def login(a):
        def wrapper(f):
            def inner(*args, **kwargs):
                if login_status['status']:
                    ret = f(*args, **kwargs)
                    return ret
                else:
                    print('请先登录')
                    '''根据a 京东,天猫 去验证不同密码'''
                    username = input('请输入用户名').strip()
                    password = input('请输入密码').strip()
                    if username == '二狗' and password == '123':
                        login_status['username'] = username
                        login_status['status'] = True
                        ret = f(*args, **kwargs)
                        return ret
    
            return inner
        return wrapper
    
    
    @login('京东')
    def jd():
        print('欢迎访问京东首页页面')
    
    
    @login('京东')
    def jdmarkte():
        print('欢迎访问京东超市页面')
    
    
    @login('天猫')
    def TM():
        print('欢迎访问天猫首页页面')
    
    @login('天猫')
    def TMmarke():
        print('欢迎访问天猫超市页面')
    
    jd()
    jdmarkte()
    TM()
    TMmarke()

    多个装饰器装饰一个函数

    def wrapper1(func):  # func = 函数名f
        def inner1():
            print('wrapper1 ,before func')  # 2
            func()  # 函数f
            print('wrapper1 ,after func')  # 4
        return inner1
    
    def wrapper2(func):  # func = inner1
        def inner2():
            print('wrapper2 ,before func')  # 1
            func()  # inner1()
            print('wrapper2 ,after func')  # 5
        return inner2
    
    
    @wrapper2  # f = wrapper2(f) 里面的f 是inner1 外面的f 是inner2
    @wrapper1  # f = wrapper1(f) 里面的f是函数名f  外面的f是 inner1
    def f():
        print('in f')  # 3
    f()  # inner2()

  • 相关阅读:
    Vue之自定义组件的v-model
    compression-webpack-plugin 开启gzip vue
    vue-i18n ,vue项目中如何实现国际化
    vue 组件的 scrollBehavior 2
    vue-router中scrollBehavior的巧妙用法
    页面刷新(vue)
    服务器配置nginx.conf文件
    mobaxterm配置nginx
    flutter环境搭建
    让GIt忽略SSL证书错误的方法
  • 原文地址:https://www.cnblogs.com/wangkaiok/p/9912173.html
Copyright © 2011-2022 走看看