净心诀---python3装饰器
python3装饰器
装饰器作用
简单理解:可以为已有函数添加额外功能
例:
已有2个函数如下
def MyFunc1():
print("This is a print function1") def MyFunc2():
print("This is a print function2")
需求:现想要在函数执行前打印类似(开始使用XXX功能)
不用装饰器方式:
def MyFunc1():
print("开始使用MyFunc1功能")
print("This is a print function1") def MyFunc2():
print("开始使用MyFunc2功能")
print("This is a print function2")
调用函数时输出:

思考:如果有很多很多的函数,那么每个函数中都要修改(而且这需要在已有函数内部去修改,部分情况下是不允许修改已有函数的),这个方式显然不可靠
采取装饰器的方式做
装饰器模板(写法)
def ShowFunction(func):
def inner(*args, **kwargs):
# 这里写函数执行前的功能
ret = func(*args, **kwargs)
return ret
return inner
利用上述装饰器模板,来写一个上述需求的装饰器
# 这是一个装饰器
def ShowFunction(func):
def inner(*args, **kwargs):
name = func.__name__
print("开始使用%s功能" %name)
ret = func(*args, **kwargs)
return ret
return inner @ShowFunction # @加函数名 这种形式就是使用某个装饰器的写法
def MyFunc1():
print("This is a print function1") @ShowFunction
def MyFunc2():
print("This is a print function2") MyFunc1()
MyFunc2()
效果如下:

现在基本上就能满足上述需求
思考:有时候不是所有的装饰器都是永久装饰函数的,在某些情况下我们会希望装饰器不生效,此时需要用到带有参数的装饰器
此时我们一般会在装饰器外部在套一个函数,来接受一个Flag,在内部用这个Flag来判断是否生效装饰器
# 现需要在调用每个函数前说明这是哪个函数,用到带装饰装饰器(可控制是否使装饰器生效)
from functools import wraps # 这是一个装饰器
Flag = 1
def FuncWrap(Flag):
def ShowFunction(func):
@wraps(func) #使外部函数调用函数属性时,不被装饰器影响
def inner(*args, **kwargs):
if Flag:
name = func.__name__
print("开始使用%s功能" %(name))
ret = func(*args, **kwargs)
else:
ret = func(*args, **kwargs)
return ret
return inner
return ShowFunction @FuncWrap(Flag) # 等于写法-->MyFunc1 = ShowFunction(MyFunc1)
def MyFunc1():
print("This is a print function1") @FuncWrap(Flag)
def MyFunc2():
print("This is a print function2") # print(MyFunc1.__name__)
MyFunc1()
MyFunc2()
我们可以修改Flag的值1(生效)或0(不生效)
扩展:多个装饰器共同装饰一个函数
# 这是一个装饰器1
def Wrap1(func):
def inner(*args, **kwargs):
print("start装饰器1")
ret = func(*args, **kwargs)
print("end装饰器1")
return ret
return inner # 这是一个装饰器2
def Wrap2(func):
def inner(*args, **kwargs):
print("start装饰器2")
ret = func(*args, **kwargs)
print("end装饰器2")
return ret
return inner @Wrap1
@Wrap2
def MyFunc1():
print("This is a print function1") MyFunc1()
关于多装饰器现象(记住即可):

净心诀---python3装饰器的更多相关文章
- python3 装饰器应用举例
[引子] python 中的装饰器是oop(面向对象编程)设计模式.之装饰器模式的一个应用.由于有语法糖衣的缘故.所以写起来也更加方便 [从一个比较经典的应用场景来讲解装饰器] 有过一定编程经历的工程 ...
- python3 装饰器全解
本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...
- python3 装饰器
#Author by Andy#_*_ coding:utf-8 _*_#装饰器的原则及构成:# 原则:# 1.不能修改被装饰函数的源代码.# 2.不能修改被装饰函数的调用方式.# 3.不能改变被装饰 ...
- python3 装饰器初识 NLP第三条
还是先抄一条NLP假设... 三,有效果比有道理更重要 光说做法有道理或者正确而不顾是否有效果,是在自欺欺人. 在三赢(我好,人好,世界好)的原则基础上追求效果,比坚持什么是对的更有意义. 说道理 ...
- python3装饰器用法示例
装饰器在编写后台的逻辑时有可能会用到,比方说一个场景:公司的员工想要登录自己公司的考勤记录系统去修改自己的考勤,以前是随便谁都有权限去修改,这样老板不同意了,现在,要在你登录前加一个权限验证的逻辑,如 ...
- python3装饰器
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >> ...
- python3 装饰器修复技术@wraps到底是什么?
Python 装饰器中的@wraps的作用: 装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能,如用户验证等 @wraps(view_func)的作用: 不改变使 ...
- Python3装饰器的使用
装饰器 简易装饰器模板 def wrapper(func): def inner(*args,**kwargs): print('主代码前添加的功能') ret=func(*args,**kwargs ...
- python3装饰器-进阶
一.wraps 作用:优化装饰器 from functools import wraps # 导入wraps def wrapper(f): @wraps(f) # wraps的语法糖 def inn ...
随机推荐
- SCI小论文投稿记录
英文小论文投的是SCI 3区的一个刊物,收录在spring,ei等, 投稿的时候2019/2/3影响因子2.8左右 现在2019/8/13 影响因子3.844 先科普下论文的各个状态 1. Subm ...
- vbox出现Failed to opencreate the internal network错误,无法启动虚拟机
vbox出现Failed to opencreate the internal network错误,无法启动虚拟机 标签(空格分隔): 未分类 问题 Failed to open/create the ...
- jdk紧急漏洞,XMLDecoder反序列化攻击
昨天在公司发现了一个jdk中的XMLDecoder反序列化的漏洞,看起来很危险!下面通过两个示例来看看这个漏洞的危害! 示例1:利用XmlDecoder删除本地文件 首先来看这个xmldecoder. ...
- redis的快速机制与数据类型
想一下 redis 的高并发和快速 单线程模型 - 避免了不必要的上下文切换和竞争条件(锁) Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Re ...
- CF585F Digits of Number Pi
题目 把\(s\)串所有长度为\(\lfloor \frac{d}{2}\rfloor\)的子串插入一个ACAM中,之后数位dp就好了,状态是\(dp_{i,j,0/1}\)第\(i\)位,在ACAM ...
- Mint安装配置Sublime Text3
1.注册码: Sublime Text 3 3126 注册码 2.安装Package Control组件: 按Ctrl+`调出console(注:安装有QQ输入法的这个快捷键会有冲突的,输入法属性设置 ...
- pytest框架结构运行规则及命名方式
Pytest框架结构 Import pytest 类似的setup,teardown同样更灵活,还有个session() 模块级 (setup_module/teardown_module) 不在类中 ...
- 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)【有源码】
原文:循序渐进学.Net Core Web Api开发系列[13]:中间件(Middleware) 系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:ht ...
- 关于SQL中 =:的含义
一个很恶臭的例子来说明 =: 在sql语句中是做什么用的 int number= 114514: //众所周知野兽先辈的咆哮(世界级美声)是一串数字 var strSql = "select ...
- Vue学习笔记【1】——什么是Vue.js
什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于We ...