Python函数装饰器可以让你轻松地为函数添加额外的功能,而不需要改变其原有的结构。它可以用来做一些非常有用的事情,比如记录函数的执行时间,检查函数的参数,缓存函数的结果等等。本文将介绍Python函数装饰器的基本概念,以及如何使用它们。
什么是函数装饰器?
函数装饰器是一种特殊的函数,它接受一个函数作为参数,并返回一个新函数。它通常用于为函数添加额外的功能,而不需要改变其原有的结构。
def decorator(func):
def wrapper():
print("Before the function")
func()
print("After the function")
return wrapper
def say_hello():
print("Hello!")
say_hello = decorator(say_hello)
say_hello()
# Output:
# Before the function
# Hello!
# After the function
上面的代码中,decorator函数接受一个函数作为参数,返回一个新函数,这个新函数在调用原来的函数之前和之后会打印一些信息。我们将say_hello函数替换为新的函数,调用say_hello()时,会先打印“Before the function”,打印“Hello!”,打印“After the function”。
如何使用函数装饰器?
使用函数装饰器非常简单,只需要在要装饰的函数前面加上@decorator语句即可。
@decorator
def say_hello():
print("Hello!")
say_hello()
# Output:
# Before the function
# Hello!
# After the function
上面的代码中,我们使用@decorator语句来装饰say_hello函数,这样,每次调用say_hello()时,都会打印“Before the function”,“Hello!”,“After the function”。
Python内置的函数装饰器
Python内置了一些函数装饰器,可以方便地完成一些任务,比如:
- @staticmethod:用于将函数声明为静态方法,可以通过类名调用。
- @classmethod:用于将函数声明为类方法,可以通过类名调用。
- @property:用于将函数声明为属性,可以通过对象名调用。
编写自定义函数装饰器
除了Python内置的函数装饰器,我们还可以编写自定义的函数装饰器。例如,我们可以编写一个装饰器,用来记录函数的执行时间:
import time
def timeit(func):
def wrapper():
start = time.time()
func()
end = time.time()
print("Time elapsed: {}".format(end - start))
return wrapper
@timeit
def say_hello():
print("Hello!")
say_hello()
# Output:
# Hello!
# Time elapsed: 0.00019311904907226562
上面的代码中,我们使用@timeit语句装饰say_hello函数,每次调用say_hello()时,都会打印函数的执行时间。
本文介绍了Python函数装饰器的基本概念,以及如何使用它们。函数装饰器可以让你轻松地为函数添加额外的功能,而不需要改变其原有的结构。Python内置了一些函数装饰器,可以方便地完成一些任务,我们还可以编写自定义的函数装饰器。