python的装饰器如果用得好,那是大神,用的不好最好别用。。。

装饰器(decorator)主要包含俩大属性:

1、不能改变原有函数的调用方式

2、不能改变原有函数的代码

第一个表示,我不需要改变原来代码的结构

第二个表示,我也不需要改吗原有函数的代码,特别是一些核心代码

先写个简单的装饰器:

def printFuncName(func):
def wrapper():
print("Enter func " + func.__name__)
func()
return wrapper @printFuncName
def helloWorld():
print("This is first helloworld!") helloWorld()

  

如上,printFuncName是个装饰器,打印进入函数的名称,helloworld是一个简单函数

如果没有装饰器printFuncName,函数helloworld调用方式为:helloworld()

加了装饰器之后(@printFuncName),调用方式仍然为helloworld(),而且也非常简洁

其实在加了装饰器之后,原始调用方式应该是下面这样:

def printFuncName(func):
def wrapper():
print("Enter func " + func.__name__)
func()
return wrapper def helloWorld():
print("This is first helloworld!") helloWorld = printFuncName(helloWorld)
helloWorld()

而为了写得简洁,所以helloWorld = printFuncName(helloWorld)直接用@printFuncName来代替了

说到这儿必须说如果原函数带参数怎么办?

这里可以把参数写到wrapper里面,如下所示:

def printFuncName(func):
def wrapper(x):
print("Enter func " + func.__name__)
func(x)
return wrapper @printFuncName
def helloWorld(x):
print("This is first helloworld!")
print(x*2) helloWorld(3)

当然有人想到,每个函数参数并不是相同的,怎么做?

python中有可变参数*args和**kwargs,这样不管你有多少个参数都可以搞定,如下:

def printFuncName(func):
def wrapper(*args,**kwargs):
print("Enter func " + func.__name__)
func(*args)
return wrapper @printFuncName
def helloWorld(x):
print("This is first helloworld!")
print(x*2) @printFuncName
def sampleTest(x,y):
print("This is sampleTest func!")
print(x**y) helloWorld(3)
sampleTest(3,3)

是不是很简单?但实际应用中怎么去用,是很关键的,只有多用多总结才能用得好~~

python之装饰器(decorator)的更多相关文章

  1. python函数编程-装饰器decorator

    函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...

  2. python 深入浅出装饰器(decorator)--举的例子关于星级争霸2(starcraft2)

    其实早就想写一篇深入浅出装饰器的文章,苦于一直没有找到很好的例子描述,自己除了在写api参数检测和日志打印的时候用到以外,其他地方也没有什么重度使用所以一直没有写. 我不会讲解装饰器的理论,还有各种基 ...

  3. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  4. 关于Python的装饰器 decorator

    装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作. 语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 de ...

  5. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  6. 关于python的装饰器(初解)

    在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...

  7. python 装饰器(decorator)

    装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...

  8. python语法32[装饰器decorator](转)

    一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...

  9. python 语法之 装饰器decorator

    装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...

随机推荐

  1. IO 、NIO、AIO

    Java 中的流 https://ifeve.com/java-nio-vs-io/

  2. 迭代器模块 itertools

    无限迭代器 itertools 包自带了三个可以无限迭代的迭代器.这意味着,当你使用他们时,你要知道你需要的到底是最终会停止的迭代器,还是需要无限地迭代下去. 这些无限迭代器在生成数字或者在长度未知的 ...

  3. Curator的cluster,实现多节点数据共享

    模拟两个客户端,实现多节点数据共享 package bjsxt.curator.cluster; import org.apache.curator.RetryPolicy; import org.a ...

  4. WordPress 自动初始化数据库

    背景 自动化搭建开发环境.测试.部署如通过网页操作(访问 /wp-admin/install.php)相对比较麻烦且在有的场景无法实现. 步骤 修改 wp-config.php 配置 wordpres ...

  5. 针对Web应用的【攻击模式篇】

    攻击模式:主动攻击.被动攻击. 主动攻击是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式. 具有代表性的攻击:SQL注入攻击和OS命令注入攻击. 被动攻击是指利用圈套策略执行攻击代码的攻击模 ...

  6. 决策树模型组合之随机森林与GBDT(转)

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  7. Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response

    问题分析: 在ServletRequest servletRequest中已经存在一个项目名称,此时,又用项目名称访问 http://localhost:8080/rent/pdf/preview r ...

  8. app已损坏,打不开。你应该将它移到废纸篓

    首先声明: 有可能并非你安装的软件已损坏,而是Mac系统的安全设置问题,因为这些应用都是破解或者汉化的,那么解决方法就是临时改变Mac系统安全设置. 出现这个问题的解决方法: 修改系统配置:系统偏好设 ...

  9. python数据结构之直接插入排序

    python数据结构之直接插入排序 #-*-encoding:utf-8-*- ''' 直接插入排序: 从序列的第二个元素开始,依次与前一个元素比较,如果该元素比前一个元素大, 那么交换这两个元素.该 ...

  10. 1.SpringMVC入门

    创建一个web工程 导入jar 配置web.xml 在web.xml配置前端控制器:DispatcherServlet <?xml version="1.0" encodin ...