详解Python 装饰器

  • Post category:Python

下面就为大家详细讲解Python装饰器的使用方法:

装饰器的定义和作用

装饰器本质上就是一个函数,它可以接受一个或多个函数作为输入,然后在不改变原函数结构的情况下,为这个函数增加一些额外的功能。

常见的一些装饰器功能包括:授权、日志、缓存、输入合理性检查等。

装饰器的一些优点包括:

  • 在不修改原函数代码的情况下,增加了其他功能。
  • 装饰器本身是一个函数,因此可以被复用多次。
  • 通过管理原函数的元数据,更加方便的调试函数。

下面我们通过两个具体的例子来详细介绍Python装饰器的使用方法。

装饰器示例一:统计函数运行时间

在Python中,我们有很多工具可以直接计算函数的执行时间,如timeit和profile等,但是我们也可以通过装饰器来实现这个功能。

下面是一个简单的统计函数运行时间的装饰器:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("{}运行时间为:{}秒".format(func.__name__, end-start))
        return result
    return wrapper

@time_it
def add(a, b):
    time.sleep(1)
    return a + b

result = add(1, 2)
print(result)

输出结果为:

add运行时间为:1.0002155303955078秒
3

从输出结果可以看出,装饰器函数time_it成功统计了函数add的运行时间,并且输出了运行时间。

装饰器示例二:打印函数参数和返回值

一个常见的问题是,如何方便地调试和确认函数的参数、返回值和执行情况。

我们可以通过装饰器来解决这个问题,下面是一个简单地打印函数参数和返回值的装饰器:

def print_args(func):
    def wrapper(*args, **kwargs):
        print("函数{}的参数为:{}".format(func.__name__, (args, kwargs)))
        result = func(*args, **kwargs)
        print("函数{}的返回值为:{}".format(func.__name__, result))
        return result
    return wrapper

@print_args
def add(a, b):
    return a + b

@print_args
def sub(a, b):
    return a - b

result1 = add(1, 2)
result2 = sub(3, 2)

输出结果为:

函数add的参数为:((1, 2), {})
函数add的返回值为:3
函数sub的参数为:((3, 2), {})
函数sub的返回值为:1

从输出结果可以看出,装饰器函数print_args成功打印了函数的参数和返回值。

以上就是Python装饰器的介绍和使用方法,希望对大家有所帮助。