欢迎访问宙启技术站
智能推送

如何编写装饰器函数的Python代码

发布时间:2023-11-17 18:35:47

装饰器是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代码的简介。希望能对您有所帮助!