Python 高阶函数的装饰器

  • Post category:Python

Python 高阶函数是指可以将函数作为参数传递,并且可以返回函数的函数。而装饰器是Python语言的一种特性,是一种高阶函数,可以接收一个函数作为参数,并且返回一个新的函数,用于扩展函数的功能和行为。下面我们将详细讲解Python高阶函数的装饰器使用方法的完整攻略。

1. 基本概念

1.1 装饰器的概念

装饰器是Python语言的一个特性,用于动态地给一个函数添加一些额外的功能。装饰器的本质是一个可调用对象,它的参数是一个函数对象,在函数调用前或者函数调用后增加一些额外的功能。

1.2 高阶函数的概念

高阶函数是指可以作为参数传递或者返回函数的函数,它通常有以下特点:

  • 接收一个或多个函数作为参数;
  • 返回一个新的函数。

2. 装饰器的使用方法

2.1 基本用法

为了方便演示,我们定义一个求和函数 add,然后用装饰器 timeit 统计它的执行时间。

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print('Time:', end_time - start_time)
        return result
    return wrapper

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

以上代码中,我们定义了一个装饰器 timeit,它的参数是一个函数对象 func,它返回一个新的函数 wrapper,在 wrapper 函数中统计了 add 函数的执行时间,并返回 add 函数的执行结果。

注: 在函数定义之前使用 @decorator_name 的语法,是Python装饰器的一种语法糖,等价于 add = decorator_name(add)

接着,我们调用 add(1, 2) 函数,来查看装饰器的效果:

>>> add(1, 2)
Time: 1.0005640983581543
3

可以看到,装饰器成功起到了对 add 函数进行装饰,并统计了其执行时间的效果。

2.2 带参数的装饰器

有时候,我们需要在装饰器中使用一些参数。此时,我们需要在装饰器的外面套一层函数,来传递这些参数。下面我们给出一个示例。

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def say_hello(name):
    print('Hello, {}!'.format(name))

以上代码中,我们实现了一个 repeat 装饰器,它传入一个参数 n,返回一个新的装饰器 decorator,它接收一个函数对象 func,返回一个新的函数 wrapper,在 wrapper 函数中循环 n 次执行 func 函数。最后,我们用这个装饰器 @repeat(3) 来修饰函数 say_hello。这表示 say_hello 函数将被重复调用 3 次。

接下来,我们调用 say_hello 函数来确保装饰器的效果:

>>> say_hello('world')
Hello, world!
Hello, world!
Hello, world!

可以看到,装饰器成功对 say_hello 函数进行了装饰,并打印了 3Hello, world!

3. 结语

以上就是Python高阶函数的装饰器使用方法的完整攻略。装饰器通用性很高,它可以用于日志记录、性能分析、事务处理、权限校验等场景。同时,装饰器还可以嵌套,这使得装饰器可以同时起到多种不同的作用。在编写Python程序时,我们建议使用装饰器来封装通用的功能,实现高效、简洁的代码。