Python函数装饰器

函数装饰器,本质是一个函数,装饰器返回了一个函数对象,它的作用是在不改变被装饰函数的结构和调用方式的前提下,给函数添加额外的功能。装饰器可以同时装饰不同的函数,这样在需要给多个函数添加同样功能时,免去了编写大量重复代码。
这个装饰器可以让我们看到递归函数求阶乘的具体执行过程,用这个装饰器可以更好的理解递归这一概念,同时,自定义的求阶乘函数f并没有被改变。

def record(fn):
    def wrapper(*args, **kwargs):
        print('准备执行%s函数' % fn.__name__)
        print(args)
        print(kwargs)
        val = fn(*args, **kwargs)
        #  此行代码在执行被装饰的函数
        #  在这行代码的前后,我们可以附加其他代码
        #  这些代码可以让我们在执行函数时做一些额外的工作
        print('%s函数执行完成' % fn.__name__)
        print('返回了%d' % val)
        return val
    return wrapper


@record
def f(n):
    if n == 0 or n == 1:
        return 1
    return n * f(n - 1)


f(5)

@符号是装饰器的语法糖,这里的@record等效于f = record(f)。
前面我们提到装饰器本身也是一个函数,它也是可以带参数的。带参数的装饰器可以做更多事情,例如它可以让一个装饰器在装饰不同函数时,附加不同的功能

import time


def deco(parameter):

    def out_wrapper(func):

        def wrapper(*args, **kwargs):
            if parameter == 'f1':  # 这个分支是解析递归函数的执行过程
                print('准备执行%s函数' % func.__name__)
                print(args)
                print(kwargs)
                val1 = func(*args, **kwargs)
                print('%s函数执行完成' % func.__name__)
                print('返回了%d' % val1)
                return val1
            elif parameter == 'f2':  # 这个分支获取函数执行用时
                start = time.time()
                func(*args, **kwargs)
                end = time.time()
                print('%s函数执行用时: %f' % (func.__name__, end - start))
        return wrapper
    return out_wrapper


@deco('f1')
def f1(n):
    if n == 0 or n == 1:
        return 1
    return n * f1(n - 1)


@deco('f2')
def f2():
    time.sleep(1)
    print('hello world')


def main():
    f1(5)
    f2(100)


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值