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

Python装饰器在面向对象编程中的应用实例

发布时间:2023-12-18 02:49:13

Python装饰器在面向对象编程中的应用主要是用于修改、扩展或包装类的方法的功能,而不需要改变原来的类的结构或功能。下面是一个使用装饰器的实例,展示了如何使用装饰器来实现对类方法的日志记录功能。

import logging

# 创建一个装饰器函数,用于添加日志记录功能
def log_decorator(func):
    def wrapper(*args, **kwargs):
        # 记录日志信息
        logging.info(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}")
        # 调用原始函数
        result = func(*args, **kwargs)
        # 记录日志信息
        logging.info(f"{func.__name__} returned {result}")
        return result
    return wrapper

# 创建一个日志记录器
logging.basicConfig(level=logging.INFO)

# 创建一个示例类
class Calculator:
    # 添加装饰器来记录日志
    @log_decorator
    def add(self, a, b):
        return a + b

    # 添加装饰器来记录日志
    @log_decorator
    def subtract(self, a, b):
        return a - b

# 创建一个计算器对象
calculator = Calculator()

# 调用计算器对象的方法,并自动记录日志
result = calculator.add(2, 3) # 输出:INFO:root:Calling add with args: (2, 3), kwargs: {}
                              # INFO:root:add returned 5
print(result)                # 输出:5

result = calculator.subtract(5, 2) # 输出:INFO:root:Calling subtract with args: (5, 2), kwargs: {}
                                   # INFO:root:subtract returned 3
print(result)                      # 输出:3

在上面的例子中,我们定义了一个装饰器函数log_decorator,它接受一个函数作为参数,并返回一个装饰后的函数。装饰后的函数wrapper用于添加日志记录的功能,它先记录日志信息,然后调用原始函数,并记录返回结果的日志信息。最后,它返回原始函数的返回结果。

我们创建了一个示例类Calculator,它有addsubtract两个方法。使用@log_decorator装饰器语法来对这两个方法进行装饰,从而实现了对这两个方法的日志记录功能。当我们调用calculator.add(2, 3)时,装饰器会自动记录相应的日志信息,包括调用方法的参数和返回结果。

通过使用装饰器,我们可以在不改变原始类的代码的情况下,为其添加额外的功能。这使得我们可以在面向对象编程中更加灵活地修改和扩展类的功能。