Python装饰器

xiaoxiao2021-02-28  47

概念

函数装饰器概念与作用:函数装饰器是可调用的对象,其参数是另一个函数。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为,例如:插入日志、性能测试、事务处理、权限校验等。

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

参考博客

转载请注明原文地址: https://www.6miu.com/read-2623218.html

最新回复(0)