Python装饰器

概念

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

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

参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值