python中decorator
先讲一下python中的@符号
看下面代码
@f
@f2
def fun(args, args2, args3, args4, ……):
pass
上面代码相当于
def fun(args, args2, args3, args4, ……):
pass
fun = fun(f2(fun))
def now():
print('2016-06-03')
n = now
n2 = now()
n2 #2016-06-03
n() #2016-06-03 #函数对象有一个name属性,可以拿到函数的名字
print(n.__name__) #n这个变量指向的函数名为now,输出结果为now def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2016-06-03')
now() #如果decorator本身需要传入参数,那就要编写一个返回decorator的高阶函数,比如自定义log的文本:
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('rain:')
def now():
print('2016-06-03')
now()
#但是像上面那样优化,装饰后的函数的__name__已经从now变成了wrapper
print(now.__name__) #可以看到now这个名字已经被改成了wrapper #为了防止依赖于签名的那些函数执行时出错,要把原来函数的__name__复制到wrapper中
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw) #注意这里返回的只是一个函数名,并没有传入参数
return wrapper @log #注意这里的也应该是一个函数名,如果看到传入某个参数的函数,那这个函数的返回值是一个函数
def ff():
print('fun is running……')
ff() #只有编写函数之前加上@log,调用这个函数的时候才会直接调用log(ff()) import functools
#针对带参数的decorator
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__)) #这里的格式,牢记牢记牢记,别出错了
return func(*args, **kw)
return wrapper
@log('rain:')
def func():
print('i love rain')
python中decorator的更多相关文章
- python中decorator的用法及原理(一)
0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...
- python 中的decorator
python 中decorator的作用就是一个包装的作用,所谓包装指在执行真正的函数之前或者之后,我们可以有一些额外的发挥余地. decorator形式如下 def dec(arg1): print ...
- 浅析python中的装饰器decorator
最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅. 定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数) 装 ...
- decorator在Python中的作用
decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...
- python中的decorator的作用
1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数. ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- [转] Python中的装饰器(decorator)
想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以 将函数复制给变量 将函数当做参数 返回一个函数 函数在Python中和变量的用法一样也是一等公民,也就是高 ...
- python中编写无参数decorator
Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = de ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
随机推荐
- The basic introduction to MIX language and machine
reference: The MIX Computer, The MIX Introduction sets, The basic info storage unit in MIX computer ...
- (Problem 40)Champernowne's constant
An irrational decimal fraction is created by concatenating the positive integers: 0.1234567891011213 ...
- 理解angular中的module和injector,即依赖注入
理解angular中的module和injector,即依赖注入 依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是java ...
- HBase ElasticSearch
http://www.open-open.com/doc/view/c2af706064f84e128d0f74826523a1ea http://www.open-open.com/doc/view ...
- 红外摄像头为什么使用850nm波长红外发射管
市面上有很多不同波长的红外发射管,其中以850nm和940nm波长为主.那么红外摄像头为什么使用850nm波长红外发射管? 首先,我们来了解一下红外摄像头的相关知识.简单来说红外摄像头是用来感应红外线 ...
- 编程实现Windows系统自动登录
编程实现Windows系统自动登录 原理: 通过注册表修改实现.Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码, ...
- 双线服务器和CDN的区别
双线机房是在国内这样特殊的网络环境下特有的产物,双线机房只能解决网通和电信访问瓶颈的问题,网络传输中的链路问题和其它各ISP互通问题还是没有得到解决. CDN的原理是边缘访问,访问者就近取数据,这样大 ...
- hdu 5040 BFS 多维化处理图
http://acm.hdu.edu.cn/showproblem.php?pid=5040 跟这一题http://blog.csdn.net/u011026968/article/details/3 ...
- linux之线程
http://blog.csdn.net/lanyan822/article/details/7586845 POSIX线程数据类型: pthread_t 线程标识符: pthread_mutex_t ...
- 在 win 10 中使用sql 2012 附加低版本数据失败的解决办法。
随着win 10 的发布,我也尝试把自己的笔记本升级下,体验win10,由于自己电脑好长时间没有管理过,东西比较乱,一激动就格式了硬盘.但是所有的资料都丢失了,不过我都提前备份到网盘上.好了,废话不多 ...