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