zoukankan      html  css  js  c++  java
  • python3装饰器用法示例

    装饰器在编写后台的逻辑时有可能会用到,比方说一个场景:公司的员工想要登录自己公司的考勤记录系统去修改自己的考勤,以前是随便谁都有权限去修改,这样老板不同意了,现在,要在你登录前加一个权限验证的逻辑,如果你权限没有达到等级要求,你就不能登录系统去修改自己的考勤记录。如何在不改动原函数的情况下去增加这部分权限验证的功能呢?这就用到的装饰器函数。

    装饰器函数的一大有点就是,在不改动原函数的基础上,去给函数增加新的功能。

    装饰器有两种,一种是没有参数的,一种是有参数的,本示例两种装饰器都有,不过只运行了有参数的。

    有关用法和解释在代码中已经注释。下面是一个例子。

    # 装饰器函数的两个特点,也是必须满足的条件
    # 1. 闭包
    # 2. 外部函数的返回值必须是内部函数
    
    # 这是一个没有参数的装饰器的例子
    def decorator(func):
        def wrapper():
            print('在登录前,先检查有没有此账号。')
            # !@#$%^&*,在数据库中查询
            # 如果数据库的已注册表中查到此用户,就执行登录函数 login()。
            # 如果没有查到,则显示“请先注册,然后登录”
            func()
        return wrapper
    
    # 上面已经写好了一个装饰器,下面是用法
    @decorator
    def login1():
        # 比方说这里是一段很复杂的逻辑,现在用登录操作代替
        print('我现在要登录了')
    
    
    # 这是一个有参数的装饰器例子
    def decorator2(func):
        def wrapper2(name):
            # 数字越小,权限越高
            priLevelDict = {'赵总': 1, '赵总': 2, '小王': 3}
    
            # 判断字典中是否存在某个key,可以用 in 或者 not in来判断
            # print('小王' in priLevelDict)
    
            if name in priLevelDict:
                print('正在对{}进行权限验证'.format(name))
                # 如果权限验证通过,则可以进行下一步的登录,管理
                # 如果权限验证不通过,则不能登录。逻辑自己设计就好
                # print(priLevelDict[name])
                if priLevelDict[name] == 1 or priLevelDict[name] == 2:
                    print('验证通过')
                    func(name)
                elif priLevelDict[name] == 3:
                    print('对不起,{},您没有权限登录,请有点自知之明。'.format(name))
                    print()
            else:
                print('你tm是谁啊,数据库里都找不到你,滚犊子。')
    
        return wrapper2
    
    @decorator2
    def login2(name):
        print('尊敬的{}, 现在您可以登录管理系统进行管理'.format(name))
        print()
    
    if __name__ == '__main__':
        while 1:
            name = input('请输入你的姓名:')
            login2(name)

    运行结果:

    请输入你的姓名:赵总
    正在对赵总进行权限验证
    验证通过
    尊敬的赵总, 现在您可以登录管理系统进行管理
    # 这可是领导,老板要查岗,必须得通过啊
    
    请输入你的姓名:钱经理
    正在对钱经理进行权限验证
    验证通过
    尊敬的钱经理, 现在您可以登录管理系统进行管理
    # 这是顶头上司,也要好好巴结一下
    
    请输入你的姓名:小王
    正在对小王进行权限验证
    对不起,小王,您没有权限登录,请有点自知之明。
    # 这是同事,说话比较随意
    
    请输入你的姓名:老李
    你tm是谁啊,数据库里都找不到你,滚犊子。
    # 这不是我们公司员工 ,不用客气
    请输入你的姓名:
  • 相关阅读:
    db4o 7.4 for .net3.5试用手记
    ruby学习笔记(2)类的基本使用
    温故而知新:设计模式之适配器模式(Adapter)
    Silverlight:Dependency Property(依赖属性)学习笔记
    Silverlight中的帧
    关闭与恢复visual studio实时调试器
    温故而知新:设计模式之桥接模式(Bridge)
    温故而知新:设计模式之单件模式(Singleton)
    一段oracle中的“复杂”分组统计sql
    VisualTreeHelper
  • 原文地址:https://www.cnblogs.com/zrmw/p/11244215.html
Copyright © 2011-2022 走看看