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. Java开发最常犯的10个错误,打死都不要犯!

    原文:http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 译文:cnblogs.com/chenpi/p ...

  2. tdom中selectNodes的使用

    tdom中selectNodes的使用 */--> pre.src {background-color: #002b36; color: #839496;} pre.src {backgroun ...

  3. 集中式日志系统 ELK 协议栈详解

    简介 在我们日常生活中,我们经常需要回顾以前发生的一些事情:或者,当出现了一些问题的时候,可以从某些地方去查找原因,寻找发生问题的痕迹.无可避免需要用到文字的.图像的等等不同形式的记录.用计算机的术语 ...

  4. Python第十二节 异常

    Python 第十三节 异常 python的错误一般包含两类: 语法错误 : 语法错误一般就是, 当你写完程序提交的时候, 发现无法提交, 提示存在错误.例如: 英文逗号 错写成了 中文逗号 异常 : ...

  5. element UI datepicker组件限制可选日期范围

    长话短说,简单粗暴上代码了,在element中的datepicker,可以自由选择日期,如下: 然后我们根据element 官网的文档,给datepicker组件动态改变 picker-options ...

  6. ionic3.0 alipay-base插件移除后会添加多余的链接文件在nodes-modules中,导致再安装其他插件或移除插件时报错问题

    1.报错截图: 2.如图因为nodes-module 文件夹中有多余的链接文件导致报错. 3.解决方法:将该链接文件删除即可.

  7. 将Eclipse项目转换成AndroidStudio项目过程中遇到的问题以及解决方法

    将Eclipse项目转换成AndroidStudio项目也不是第一次了,昨天转的时候遇到几个问题: 首先将项目导入androidstudio,导完后报错: 问题一: Error:java.util.c ...

  8. 安装 sysbench的 报错 /usr/bin/ld: cannot find -lmysqlclient_r 解决办法

    首先你需要找到这个库的位置 一般找的话需要将lib 给加上(注意:我这里是 -lmysqlclient_r 的报错,于是我找就找 libmysqlclient_r ) find / -name lib ...

  9. Typora 精美而强大的Markdown编辑器 转

    Typora 精美而强大的Markdown编辑器 Markdown编辑器千千万,可是有颜值.功能强并且免费的,就没有几个了.之前一直在用Mou,分屏预览模式方便得很,是一个非常好的选择.不过这篇可不是 ...

  10. 如何在webpack中使用loader

    一.什么是loader loader 用于对模块的源代码进行转换.loader 可以使你在 import 或"加载"模块时预处理文件.因此,loader 类似于其他构建工具中“任务 ...