概念
函数装饰器概念与作用:函数装饰器是可调用的对象,其参数是另一个函数。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为,例如:插入日志、性能测试、事务处理、权限校验等。
1、函数装饰器
1.1 函数的函数装饰器的一个例子
def decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
func()
print time.time() - start
return wrapper
###############################
# 等价于func = decorator(func) #
###############################
@decorator
def func():
time.sleep(0.8)
if __name__ == '__main__':
func()
1.2 类方法的函数装饰器的一个例子
def decorator(func):
def wrapper(method_instance):
start = time.time()
func(method_instance)
print time.time() - start
return wrapper
class Method(object):
@decorator
def func(self):
time.sleep(0.8)
if __name__ == '__main__':
inst = Method()
inst.func()
对于类方法,都会有一个默认的参数self
,它实际表示的是类的一个实例,所以在装饰器的内部函数wrapper也要传入一个参数,这里用method_instance
指代,表示将类Method
的实例inst
传给wrapper
.
2、类装饰器
class Decorator(object):
def __init__(self, f):
self.f = f
def __call__(self):
print "running decorate..."
self.f()
print "done"
@Decorator
def func():
print "running func..."
if __name__ == '__main__':
func()
3、functools.wraps()
装饰器会覆盖被装饰函数的__name__
和__doc__
属性,使用functools.wraps
装饰器,可以把相关属性从被装饰函数复制到装饰器函数。
def decorator(func):
def inner_function():
pass
return inner_function
@decorator
def func():
pass
print(func.__name__)
# 输出: inner_function
from functools import wraps
def decorator(func):
@wraps(func)
def inner_function():
pass
return inner_function
@decorator
def func():
pass
print(func.__name__)
#输出: func