净心诀---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 ...
随机推荐
- Leetcode 跳跃游戏 II
题目链接:https://leetcode-cn.com/problems/jump-game-ii/ 题目大意: 略. 分析: 贪心 + DP. 代码如下: class Solution { pub ...
- 把数字翻译成字符串 --剑指offer 46题
# 给一个字符串,按如下规则把它翻译成字符串:1翻译成a,2翻译成b,...25翻译成z:一个数可以有多种翻译方式,比如122可以翻译成abb和kb还可以翻译成aw即3种翻译方式.计算一个数字有几种翻 ...
- Javascript生成器函数
function* 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个Generator 对象 示例: function* g ...
- android 拖拉和放大
public class MainActivity extends Activity { private ImageView imageView; @Override public void onCr ...
- Docker-搭建Docker Registry
私有Docker Registry的部署和配置 从Docker Hub上可以获取官方的Registry的镜像,Registry 默认的对外服务端口是 5000,如果我们宿主机上运行的 Registry ...
- 服务器安装宝塔linux系统控制面板
一.使用远程连接软件 (如 Putty.XShell) 连接你的Linux服务器,本教程以 Putty 为例. 1 启动 Putty.exe 程序,进入 Putty 主界面. 2 在 Host ...
- 怎么进行代码审查(Code Review)
代码审查的重要性 代码审查是熟悉软件架构,了解软件业务逻辑的好方法.学习代码是需要切入点的,一个上百万行代码的系统,从哪里开始着手?只能一个模块一个模块,一个组件一个组件的来熟悉,掌握.实现一个比较大 ...
- Ansible批量自动化管理工具(二)
Ansible批量自动化管理工具(二) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打开百度网盘手机App,操 ...
- 一些笔记jexcel
根据坐标或者指定列标题 jexcel.getColumnNameFromId([ x, y ]);
- 关于linux centos7 vmware 和windows7 文件共享笔记
本方法是以win7,VMware9.0.1 ,centos6.4为基础实验的. 对于linux的初级使用阶段,都会Windows中使用linux虚拟机VMWare或者其它的.在Windows与linu ...