如何编写装饰器函数的Python代码
装饰器是Python中的一种特殊函数,用于修改其他函数的功能。装饰器函数接受一个函数作为参数,并返回一个新的函数。下面是如何编写装饰器函数的Python代码。
1. 基础知识:
在编写装饰器之前,我们需要了解一些基础知识。
- 函数是一等公民:在Python中,函数可以作为参数传递给其他函数,也可以作为返回值返回。
- 闭包:闭包是指在一个内层函数中引用了外层函数的变量,内层函数可以访问外层函数的变量,即使外层函数已经执行完毕。
- @语法糖:Python提供了一种简化装饰器语法的方式,即使用@符号直接在函数定义上方添加装饰器。
2. 编写装饰器函数:
以下是一个简单的装饰器函数的示例,将打印函数执行前后的时间。
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执行时间为: {end_time - start_time} 秒")
return result
return wrapper
在上面的代码中,装饰器函数timer接受一个函数作为参数,返回一个新的函数wrapper。
3. 使用装饰器函数:
使用@语法糖来应用装饰器函数。在需要装饰的函数上方添加@装饰器函数名。
@timer
def my_function():
time.sleep(1)
print("Hello, World!")
my_function()
在上面的代码中,我们使用@timer语法糖将函数my_function与装饰器函数timer关联起来。当调用my_function时,实际上调用的是装饰器函数wrapper。
4. 装饰带有参数的函数:
如果需要装饰的函数是带有参数的,我们可以在wrapper函数中使用*args和**kwargs来接受任意数量的位置参数和关键字参数,并将它们传递给原始函数。
def logger(func):
def wrapper(*args, **kwargs):
print(f"函数 {func.__name__} 被调用")
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
result = add(2, 3)
print(result)
在上面的例子中,我们使用装饰器函数logger装饰了函数add,在add函数执行前后打印一条日志。
5. 保留原始函数属性:
装饰器函数会替换原始函数,所以一些原始函数的属性会丢失。为了解决这个问题,需要使用functools模块的wraps装饰器来保留原始函数的元数据。
import functools
def logger(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"函数 {func.__name__} 被调用")
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
"""相加两个数字"""
return a + b
print(add.__name__) # 输出 add
print(add.__doc__) # 输出 相加两个数字
在上面的代码中,使用@functools.wraps(func)装饰函数wrapper,这样可以保留原始函数的元数据。
这是关于如何编写装饰器函数的Python代码的简介。希望能对您有所帮助!
