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

如何在Python中使用装饰器(Decorators)?

发布时间:2023-06-12 07:41:51

Python中的装饰器是函数或类,用于修改或增强类或函数的功能。装饰器可以在不更改原始代码的情况下,提供可重复使用的功能和功能的组合。

装饰器本质上是一个函数,该函数参数是另一个函数或类对象,返回值是通常情况下也是另一个函数或类对象。使用装饰器的步骤分为三个部分:

- 定义装饰器函数

- 定义被装饰函数(或类对象)

- 应用装饰器

以下是一个简单的函数装饰器示例,用于在函数开始和结束时打印时间戳。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Time elapsed: {} seconds".format(end_time - start_time))
        return result    
    return wrapper

@timing_decorator
def my_function():
    time.sleep(2)

上述代码中,timing_decorator 是装饰器函数,实现了一个计时器,用于计算被装饰函数执行的时间。wrapper 是内部定义的函数,它接受被装饰函数(*args**kwargs是任何参数和关键字参数的元组和字典),执行计时操作,然后返回结果。

通过在my_function函数上使用装饰器语法@timing_decorator,我们可以在不改变my_function实际实现的情况下,对其功能进行扩展。装饰器函数作为一个中间媒介来增强函数的功能。

装饰器还可以用于类对象。以下是一个简单的类装饰器示例,用于检查类中是否存在特定属性:

def check_attribute_decorator(attribute_name):
    def wrapper(cls):
        if not hasattr(cls, attribute_name):
            raise AttributeError("Class has no {} attribute".format(attribute_name))
        return cls
    return wrapper

@check_attribute_decorator('name')
class Person:
    def __init__(self, name):
        self.name = name

上述代码中,check_attribute_decorator接受attribute_name作为输入参数。装饰器定义了wrapper函数,在类定义中运行时检查特定属性是否存在。如果没有找到该属性,装饰器引发AttributeError异常。

Person类使用装饰器语法@check_attribute_decorator('name')应用了装饰器。在运行时,装饰器检查类中是否包含在装饰器中指定的name属性,如果没有,它将引发AttributeError异常。

使用装饰器可以提供一种以声明方式在代码中添加功能的方式,将函数和类解耦。装饰器可以轻松地应用于多个函数,以提供通用的功能,例如日志记录、数据验证、性能测试和异常处理。