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

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

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

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

# 装饰器函数的两个特点,也是必须满足的条件
# 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是谁啊,数据库里都找不到你,滚犊子。
# 这不是我们公司员工 ,不用客气
请输入你的姓名:

python3装饰器用法示例的更多相关文章

  1. Python学习第四十天函数的装饰器用法

    在软件开发的过程中,要遵循软件的一些原则封装的,不改变原有的代码的基础增加一些需求,python提供了装饰器来扩展函数功能,下面说说函数装饰器用法 def debug(func):      def ...

  2. 净心诀---python3装饰器

    python3装饰器 装饰器作用 简单理解:可以为已有函数添加额外功能 例: 已有2个函数如下 def MyFunc1(): print("This is a print function1 ...

  3. Python装饰器用法

    在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...

  4. python3 装饰器应用举例

    [引子] python 中的装饰器是oop(面向对象编程)设计模式.之装饰器模式的一个应用.由于有语法糖衣的缘故.所以写起来也更加方便 [从一个比较经典的应用场景来讲解装饰器] 有过一定编程经历的工程 ...

  5. python3 装饰器全解

    本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...

  6. python3装饰器

    由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >> ...

  7. python3 装饰器

    #Author by Andy#_*_ coding:utf-8 _*_#装饰器的原则及构成:# 原则:# 1.不能修改被装饰函数的源代码.# 2.不能修改被装饰函数的调用方式.# 3.不能改变被装饰 ...

  8. python3 装饰器初识 NLP第三条

    还是先抄一条NLP假设... 三,有效果比有道理更重要   光说做法有道理或者正确而不顾是否有效果,是在自欺欺人. 在三赢(我好,人好,世界好)的原则基础上追求效果,比坚持什么是对的更有意义. 说道理 ...

  9. PYTHON装饰器用法及演变

    '''开放封闭原则: 软件一旦上线之后就应该满足开放封闭原则 具体就是指对修改是封闭的,对扩展是开放的装饰器:什么是装饰器:装饰就是修饰,器指的是工具装饰器本省可以是任意可调用的对象被装饰的对象也可以 ...

随机推荐

  1. Idea工具Debug快捷键

    F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 Step Over 相当于eclipse的f6 跳到下一步 F7 Step ...

  2. LeetCode 链表题 ( Java )

    leetcode 237. 删除链表中的节点 链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 示例 : 输入: he ...

  3. Shell入门01-bash Shell特性

    命令和文件自动补齐 [root@hadoop04 ~]# yum -y install bash-completion 命令历史记忆功能 1.上下键 查看历史命令 2.!number 执行histor ...

  4. U盘中病毒无法更改U盘隐藏属性,文件变成快捷方式

    问题:U盘中病毒了文件都变成快捷方式了,文件被隐藏:隐藏属性无法修改 解决方法: 1.首先给U盘杀毒[如360杀毒] 2.修改U盘隐藏属性:如下图 经过此步骤被隐藏的文件可以被显示出来了.但是U盘里的 ...

  5. Python装饰器总结,带你几步跨越此坑!

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  6. 区块链学习笔记:D04 区块链在各行业领域的应用(二)

    这节课主要是政务领域.版权存证领域.能源领域的应用案例介绍 1.房屋租赁联盟链 特点:真实可信.透明补贴.便于追溯.公共监督 节点:房屋运营节点.房管局节点.社保局节点.财政局节点.教育部门节点(多节 ...

  7. 转:Java transient关键字使用小记

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...

  8. 如何在Android手机上进行自动化测试(上)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本节教程,你将了解到以下内容: 如何在脚本代码中.运行脚本时指定手机 如何填写--device Android:/// ...

  9. RocketMQ 主题扩分片后遇到的坑

    目录 1.案情回顾 1.1 集群现状 1.2.RocketMQ 在线扩容队列 1.3 消息发送 2.问题暴露 3.问题分析 4.问题复盘 消息组接到某项目组反馈,topic 在扩容后出现部分队列无法被 ...

  10. WeihanLi.Npoi 支持 ShadowProperty 了

    WeihanLi.Npoi 支持 ShadowProperty 了 Intro 在 EF 里有个 ShadowProperty (阴影属性/影子属性)的概念,你可以通过 FluentAPI 的方式来定 ...