概念
函数装饰器概念与作用:函数装饰器是可调用的对象,其参数是另一个函数。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为,例如:插入日志、性能测试、事务处理、权限校验等。
1、函数装饰器
1.1 函数的函数装饰器的一个例子
def decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
func()
print time.time() - start
return wrapper
@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()
装饰器会覆盖被装饰函数的__name__和__doc__属性,使用functools.wraps装饰器,可以把相关属性从被装饰函数复制到装饰器函数。
def decorator(func):
def inner_function():
pass
return inner_function
@decorator
def func():
pass
print(func.__name__)
from functools
import wraps
def decorator(func):
@wraps(func)
def inner_function():
pass
return inner_function
@decorator
def func():
pass
print(func.__name__)
参考博客