python中的函数修饰器 – @wrapper
简介
类似于C#的属性、Java的注解,python也有对应的修饰符。从Python2.7和Python3开始,提供了以’@’为标示的修饰符,可以在模块或者类的定义层次内对函数进行修饰。
定义形式
修饰符定义出现在函数定义的前一行,不允许和函数定义在同一行;并且支持多个修饰符,每行一个。
decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
dotted_name ::= identifier ("." identifier)*
使用
一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的函数对象。
而且,函数修饰符可以如下形式嵌套.
@f1(arg)
@f2
def func(): pass
这相当于如下代码:
def func(): pass
func = f1(arg)(f2(func))
示例
示例1–简单的decorator
# encoding=utf-8
"""
python decorator sample
简单的python修饰符示例
"""
## 定义的decoration 处理函数
def ann1(fn):
def samplejob(*args):
print("ann1's sample job.")
fn(*args) ## 必须的,否则被修饰的函数不被调用,无法执行了。
return samplejob
def ann2(fn):
def _decorator(*args):
print("ann2:\r\nget params: ")
for item in args:
print item
print("\r\ncalculate result: ")
fn(*args) ## 必须的,否则被修饰的函数不被调用,无法执行了。
return _decorator
@ann1
@ann2
def mult(a,b):
print(a*b)
if __name__ == "__main__":
mult(2,5)
示例2–带参数的decorator
# encoding=utf-8
"""
python decorator sample:
带参数的python修饰符
"""
## 定义的decoration修饰器及处理函数
def attrs(**kwds):
def decorate(f):
## 可以访问传入的参数kwds
print "decorate attr: ", len(kwds)
for k in kwds:
# def setattr(object, name, value):
# Set a named attribute on an object; setattr(x, 'y', v) is equivalent to `x.y = v''.
setattr(f, k, kwds[k])
return f
return decorate
@attrs(versionNeeded="2.7",
author="David",
dt="2018-01-01")
def test_method(f):
# def getattr(object, name, default)
# getattr(object, name[, default]) -> value
print(getattr(test_method,'versionNeeded',0))
print(getattr(test_method,'author','none'))
print(getattr(test_method,'dt','2000-01-01'))
print 'working with param:', f
if __name__ == "__main__":
test_method(8)