Python 高阶函数的装饰器

  • Post category:Python

Python 高阶函数的装饰器是一种非常强大的编程技巧,可以用于简化代码块的共性,提高代码的可复用性和可维护性。在Python中,一个函数可以作为另一个函数的输入,也可以视为另一个函数的输出,因此可以通过操作函数作为一等公民的特性来动态修改函数的行为。

装饰器的使用方法

首先,需要明确装饰器的使用方法。装饰器可以理解为是一个包装器,使用装饰器的语法:

@decorator
def func():
    pass

等价于:

def func():
    pass

func = decorator(func)

因此,装饰器就是一个函数,它接受一个函数对象作为输入,对其进行一些处理,并返回一个新的函数对象。

示例1:装饰器基本使用

下面是一个最简单的装饰器示例,它可以在函数执行前后打印一些日志信息:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"{func.__name__}({args}, {kwargs}) is called.")
        ret = func(*args, **kwargs)
        print(f"{func.__name__} returns {ret}.")
        return ret
    return wrapper

@logger
def add(x, y):
    return x + y

print(add(1, 2))

输出结果为:

add((1, 2), {}) is called.
add returns 3.
3

可以看到,在调用 add 函数时,装饰器 logger 自动将函数调用的参数和返回值打印出来,可以方便地进行调试和分析。

示例2:装饰器分组管理

除了添加日志信息以外,装饰器还可以用于分组管理。假设我们有一个函数集合,其中不同的函数对应不同的功能,在调用函数时,需要针对不同的函数进行不同配置,可以使用装饰器将这些共性进行封装,从而提高代码的可复用性和可维护性。

handler = {}

def register(name):
    def wrapper(func):
        handler[name] = func
        return func
    return wrapper

@register("func1")
def func1():
    print("func1 is called.")

@register("func2")
def func2():
    print("func2 is called.")

handler.get("func1")() # 调用func1
handler.get("func2")() # 调用func2

通过 register 装饰器,可以将不同的函数自动添加到处理器列表中,调用时只需要直接调用该名称对应的处理函数即可。

总结

装饰器是Python中非常有用的高阶函数,通过它可以将一些共性的功能进行封装,提高了代码的可复用性和可维护性。在日常开发中,经常使用装饰器对函数进行修饰,添加一些日志信息、验证机制等。由于装饰器本质上是一个函数,因此可以进行自己定制的实现,比如带参数的装饰器、装饰器链等。