净心诀---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 ...
随机推荐
- Java对象toString()方法
对象的字符串表示以可读格式包含有关对象状态的信息.Object类的toString()方法表示字符串中类的对象.Object类提供了toString()方法的默认实现. 它返回一个以下格式的字符串: ...
- oracle查询不显示小数点前的0
1.问题起源 oracle 数据库字段值为小于1的小数时,使用char类型处理,会丢失小数点前面的0 例如0.35就变成了.35 2.解决办法:用to_char函数格式化数字显 ...
- jmeter 后台运行 setsid bin/jmeter -n -t .jmx文件 -l .jtl文件
备注: 另外,在Linux下我们有时候希望线程可以在后台运行,这样我们关闭当前连接后,线程依然可以运行,这里提供一个将 jmeter命令设置为后台线程的方法. 使用setsid命令: setsid ...
- Anjular的ng-repeat
Anjular的ng-repeat不会循环一个二维集合中的一维集合.举个例子:集合 list= {1,2,{0,1,2},23,222},small={0,1,2},使用ng-repeat" ...
- springboot核心原理
1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行. 2. ...
- 纯css设置元素过渡效果
1.首先,先设置一个div,待会我们使用css3给这个div设置过渡效果. 2.然后给div设置宽高和背景,这里我就设置成200像素,深粉色. 3.接着开始设置transition属性,通过这个属性就 ...
- mac 密码重置
首先请开机或重新启动系统,在电脑刚启动时,请按下键盘上的 command+S 组合键不动, 接下来会在屏幕上看到一串串的命令字符显示,当进入安全模式以后,会看到 一个 root 开始的命令行输入端口. ...
- Neo4J空间数据存储
1.Neo4j Spatial 简介 1.1Neo4j Spatial概念 Neo4j Spatial项目是图数据库Neo4j的一个插件,它通过将空间数据映射到图模型(graph model),它将对 ...
- 嵌入式 emmc 中 安装 烧录 内核 kernel,设备树 devicetree ,根文件系统 rootfs
一般调试嵌入式开发板喜欢选择 利用 TFTP 传送 内核与 设备树, 利用 nfs 加载根文件系统. uboot 环境变量 设置如下: bootargs=root=/dev/nfs rw nfs ...
- 【Luogu】【关卡2-16】线性动态规划(2017年10月)【还差三道题】
任务说明:这也是基础的动态规划.是在线性结构上面的动态规划,一定要掌握. P1020 导弹拦截 导弹拦截 P1091 合唱队形 老师给同学们排合唱队形.N位同学站成一排,音乐老师要请其中的(N-K)位 ...