欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在函数上添加装饰器

程序员文章站 2022-06-01 20:20:28
...

想在已经存在的函数上添加一个装饰器,增加额外的操作处理(比如权限,日志、计时等)。

例如:

import time
from functools import wraps


def Count_Time(func):
    """
    :param func:
    :return:
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(func.__name__, end - start)
        return result

    return wrapper


@Count_Time
def countdown(n):
    '''
    Counts down
    '''
    while n > 0:
        n -= 1


if __name__ == "__main__":
    countdown(100000)
    countdown(10000000)

一个装饰器就是一个函数,它接受一个函数作为参数并返回一个新的函数, 内置的装饰器比如 @staticmethod, @classmethod,@property 原理也是一样的。
wrapper() 函数中, 装饰器内部定义了一个使用 *args 和 **kwargs 来接受任意参数的函数。 在这个函数里面调用了原始函数并将其结果返回,然后这个新的函数包装器被作为结果返回来代替原始函数。
装饰器并不会修改原始函数的参数签名以及返回值。 使用 *args 和 **kwargs 目的就是确保任何参数都能适用。 而返回结果值基本都是调用原始函数 func(*args, **kwargs) 的返回结果,其中func就是原始函数。

  • 使用 @wraps(func) 注解是很重要的, 它能保留原始函数的元数据。
相关标签: 装饰器