Python装饰器--decorator
装饰器 装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能。
如果我们需要打印函数调用前后日志,可以这么做
def log(func):
print('%s is running' % func.__name__)
func() def bar():
print('bar')
#将bar作为函数log参数传入
>>>log(bar)
bar is running
bar
这样写下来一个函数打印一个函数的日志是没有问题的,但是很多呢?
def log(func)
def wrapper(*args,**kw):
print('%s',%func.__name__)
return func(*args,**kw)
return wrapper def bar():
print('bar')
bar = log(bar) bar()
借助decorator的语法糖,一个@就可以解决
def log(func):
def wrapper(*args,**kw):
print('call %s()' %func.__name__)
return func(*args,**kw)
return wrapper @log #相当于bar = log(bar)
def bar():
print('this is bar') @log
def bar2():
print('this is bar2')
装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。 装饰器是允许带参数的,装饰器的语法可以使我们在调用时,提供其他参数。
import functools
def log(level):
def decorator(func):
#@functools.wraps(func) #这里先注释一下
def wrapper(*args,**kw):
print('%s %s()'% (level,func.__name__))
return func(*args,**kw)
return wrapper
return decorator
@log('execute')
def bar():
print('bar')
>>>bar()
execute bar()
bar >>>print(bar.__name__)
wrapper
这里的@log('execute')相当于 bar = log('execute')(bar)
函数对象可以通过__name__属性拿到名称
bar.__name__ 拿到的是wrapper,这是因为bar函数经过装饰器装饰之后,最终返回了wrapper函数
如果不更改bar.__name__的属性,在一些依赖函数签名的代码中就会出错
Python自带的functools.wraps就是将原始函数__name__赋值给wrapper
import functools
def log(level):
def decorator(func):
@functools.wraps(func) #这里删除注释
def wrapper(*args,**kw):
print('%s %s()'% (level,func.__name__))
return func(*args,**kw)
return wrapper
return decorator
@log('execute')
def bar():
print('bar') >>>bar()
execute bar()
bar >>>print(bar.__name__)
bar #__name__还原成了bar
类的装饰器
参考链接知乎--Python装饰器
Python装饰器--decorator的更多相关文章
- python 装饰器(decorator)
装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...
- Python 装饰器Decorator(一)
(一) 装饰器基础知识 什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数) 假如有一个名字为somedecorator的装饰器,target是 ...
- Python装饰器(Decorator)简介
Python有许多出色的语言特性,装饰器(Decorator)便是其中一朵奇葩.先来看看一段代码: def deco1(f): print 'decorate 1' return f def deco ...
- Python 装饰器Decorator(二)
对于上一篇“”Python闭包“”随笔中提到的make_averager()函数的如下实现,我们把历史值保存在列表里,每次计算平均值都需要重新求和,当历史值较多时,需要占用比较多的空间并且效率也不高. ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- python语法32[装饰器decorator](转)
一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...
- python 语法之 装饰器decorator
装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...
- python函数编程-装饰器decorator
函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...
- Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
随机推荐
- SpringBoot war包部署到Tomcat服务器
(1)pom.xml文件修改<packaging>war</packaging>,默认是jar包,<build>节点中增加<finalName>spri ...
- jenkins 异常
八月 03, 2017 7:23:54 下午 org.eclipse.jetty.util.log.JavaUtilLog warn 警告: FAILED ServerConnector@29e6eb ...
- 解决:springmvc中接收date数据问题
这里提供三种解决方案. 一.局部转换 :只是对当前Controller类有效 springMVC.xml中添加: <bean class="org.springframework.we ...
- jqGrid API (转)
来源:https://www.cnblogs.com/MonaSong/p/5109991.html JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGr ...
- Appium典型问题处理
1. http://ask.testfan.cn/article/902 Appium 服务端安装-windows2. http://ask.testfan.cn/article/1078 最新版本a ...
- Perl关联数组用法集锦
本文和大家重点讨论一下Perl关联数组的概念,创建Perl关联数组,从数组变量复制到Perl关联数组,元素的增删,用Perl关联数组循环等内容,相信通过本文的学习你对Perl关联数组的用法一定会有深刻 ...
- async函数对比Generator函数
首先定义一个读取文件的异步函数 var readFile = function(fileName){ return new Promise((resolve,reject)=>{ fs.read ...
- Vue运行报错--not defined
按F12键进入调试模式,谷歌总是提示Uncaught ReferenceError: ——is not defined这个错误. 原来是因为虽然是传递的值,但是在函数传参的时候也要加引号,加上引号后就 ...
- 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础
在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...
- 在使用Java8并行流时的问题分析
最近在使用Java8的并行流时遇到了坑,线上排查问题时花了较多时间,分享出来与大家一起学习与自查 // 此处为坑 List<Java8Demo> copy = Lists.newArray ...