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装饰器的更多相关文章

  1. python3 装饰器应用举例

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

  2. python3 装饰器全解

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

  3. python3 装饰器

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

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

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

  5. python3装饰器用法示例

    装饰器在编写后台的逻辑时有可能会用到,比方说一个场景:公司的员工想要登录自己公司的考勤记录系统去修改自己的考勤,以前是随便谁都有权限去修改,这样老板不同意了,现在,要在你登录前加一个权限验证的逻辑,如 ...

  6. python3装饰器

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

  7. python3 装饰器修复技术@wraps到底是什么?

    Python 装饰器中的@wraps的作用:    装饰器的作用:    在不改变原有功能代码的基础上,添加额外的功能,如用户验证等    @wraps(view_func)的作用:     不改变使 ...

  8. Python3装饰器的使用

    装饰器 简易装饰器模板 def wrapper(func): def inner(*args,**kwargs): print('主代码前添加的功能') ret=func(*args,**kwargs ...

  9. python3装饰器-进阶

    一.wraps 作用:优化装饰器 from functools import wraps # 导入wraps def wrapper(f): @wraps(f) # wraps的语法糖 def inn ...

随机推荐

  1. 2019浙江省赛 Strings in the Pocket【manacher】

    Strings in the Pocket 题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个字符 ...

  2. 搭建RAID10(5块硬盘)过程并模拟其中一块硬盘损坏

    首先:RAID 10,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余.它的优点是同时拥有RAID 0的超 ...

  3. LINUX 安装PHP GD库遇到的坑

    本文借鉴:https://www.cnblogs.com/gaohj/p/3152646.html linux下为php添加GD库的步骤如下: 一.下载 gd-.tar.gz http://www.b ...

  4. 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护

    先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...

  5. Matplotlib ValueError: _getfullpathname: embedded null character

    Traceback (most recent call last): File "<stdin>", line 1, in <module> File &q ...

  6. iView的page 组件

    //html <div class="pageNation"> <Page :total= totalPages :page-size= pageSize siz ...

  7. 截取url参数

    //获得参数(只对字母数字等有效,参数值为中文则不能传) function getQueryString(name) { var reg = new RegExp("(^|&)&qu ...

  8. python获取网页源代码

    最简单的网页取源(不用模拟浏览器的情况) import requests def getHTML(url): try: r = requests.get(url,timeout=30) r.raise ...

  9. JSONObject.toJSONString(map)

    Map<Integer, List<Integer>> map = new LinkedHashMap<>(); map.put(1,ddzCard.getOneS ...

  10. Jmeter实现百分比业务比例

    Jmeter实现百分比业务比例   相较于LoadRunner,jmeter在复杂场景方式貌似略有欠缺.前一段时间,想实现一个功能,如有两个采样器a与b,a采样器与b采样器被执行的概率分别为1/4与3 ...