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
函数进行了装饰,并打印了 3
次 Hello, world!
。
3. 结语
以上就是Python高阶函数的装饰器使用方法的完整攻略。装饰器通用性很高,它可以用于日志记录、性能分析、事务处理、权限校验等场景。同时,装饰器还可以嵌套,这使得装饰器可以同时起到多种不同的作用。在编写Python程序时,我们建议使用装饰器来封装通用的功能,实现高效、简洁的代码。