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.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
随机推荐
- WinForm 拖动、移动窗体
private const int WM_NCLBUTTONDOWN = 0XA1; private const int HTCAPTION = 2; [System.Runtime.InteropS ...
- dataTables使用整理(一)
初次使用dataTables,对一些用到的属性及遇到的问题做一个简要的记录 参考资料: http://blog.csdn.net/mickey_miki/article/details/8240477 ...
- win 10 安装visual studio 2010
链接: https://pan.baidu.com/s/1JzA2Ei8NEGRPck253NUM9g 提取码: 52pt 点击下一步即可.
- js_提示是否删除小案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 求1000以内的质数c语言
之前在做求1000以内的质数的时候,我们一般能想到的就是从3~(根号)no,逐一和no除,如果存在某个i使得 i|no成立的话,说明no不是质数(“i|no”是i整除除no的意思): 在<明解 ...
- feature map 大小以及反卷积的理解
(1)边长的计算公式是: output_h =(originalSize_h+padding*2-kernelSize_h)/stride +1 输入图片大小为200×200,依次经过一层卷积(ke ...
- Bagging和Boosting的区别(面试准备)
Baggging 和Boosting都是模型融合的方法,可以将弱分类器融合之后形成一个强分类器,而且融合之后的效果会比最好的弱分类器更好. Bagging: 先介绍Bagging方法: Bagging ...
- C# 获取当前服务器运行程序的根目录
C# 获取当前服务器运行程序的根目录,获取当前运行程序物理路径 string tmpRootDir = AppDomain.CurrentDomain.BaseDirectory;//获得当前服务器程 ...
- (转)3个常用基于Linux系统命令行WEB网站浏览工具(w3m/Links/Lynx)
一般我们常用的浏览器肯定是基于可视化界面的图文结合的浏览界面效果,比如FireFox.Chrome.Opera等等,但是有些时候折腾和项目 的需要,在Linux环境中需要查看某个页面的文字字符,我们需 ...
- C#如何实现类似QQ那样靠边隐藏的功能
http://www.cnblogs.com/yechensi/archive/2009/08/02/1537145.html C#如何实现类似QQ那样靠边隐藏的功能 你想过为自己的程序添加靠边隐藏的 ...