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. spark streaming之三 rdd,job的动态生成以及动态调度

    前面一篇讲到了,DAG静态模板的生成.那么spark streaming会在每一个batch时间一到,就会根据DAG所形成的逻辑以及物理依赖链(dependencies)动态生成RDD以及由这些RDD ...

  2. Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3

    参考 https://blog.csdn.net/verkery6/article/details/80797705

  3. python中tolist()命令

  4. Python学习积累:使用help();打印多个变量;fileno()

    1.使用篇: 1.1如何从help()退出: 直接回车即可! 2.技能篇: 2.1 如何一次性打印多个变量? 多个变量中间使用逗号隔开,且引用变量为%(变量1,变量2,变量3), 2.2fileno( ...

  5. ie每次登陆出现:Windows安全性 iexplore.exe 正在连接到 记住我的凭证不起作用

    解决方案: ie浏览器--设置--Intenet选项--安全--Internet--自定义级别--用户身份验证--登陆 勾选自动使用当前用户名和密码登陆 确定--确定

  6. 关于requests库中文编码问题

    转自:代码分析Python requests库中文编码问题 Python reqeusts在作为代理爬虫节点抓取不同字符集网站时遇到的一些问题总结. 简单说就是中文乱码的问题.   如果单纯的抓取微博 ...

  7. xsd

    2018-10-08 <xsd:annotation> <xsd:documentation> <![CDATA[ 说明文档 ]]> </xsd:docume ...

  8. 关于session共享

    最近在银行部署项目,一台Nginx做负载均衡,两台Tomcat,两台Oracle互备,一台ftp文件服务器.Tomcat涉及到session共享问题,所以就在这里做一下总结. 首先关于session ...

  9. openstack之cinder_backup对接ceph存储

    M版openstack,是kolla部署的 1.介绍 backup 功能好像与 snapshot 很相似,都可以保存 volume 的当前状态,以备以后恢复.但二者在用途和实现上还是有区别的,具体表现 ...

  10. JavaScript基础视频教程总结(021-030章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...