You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Python凯撒密码实现记录参数与结果的日志装饰器

用装饰器自动记录凯撒密码Facade类的操作日志

核心问题是让装饰器能访问类实例的self._history属性,在调用加密/解密方法时自动捕获参数与结果并写入日志。以下是可行的实现方案:

实现步骤

1. 编写日志装饰器

这个装饰器专门处理类的实例方法,能自动获取实例对象、调用参数和返回结果,将日志信息存入实例的_history列表:

def log_operation(func):
    def wrapper(self, *args, **kwargs):
        # 执行原方法并获取结果
        result = func(self, *args, **kwargs)
        # 整理日志内容,兼容位置参数与关键字参数
        log_entry = {
            "operation": func.__name__,
            "text": args[0] if args else kwargs.get("text"),
            "shift": args[1] if len(args) >= 2 else kwargs.get("shift"),
            "result": result
        }
        # 将日志添加到实例的历史记录中
        self._history.append(log_entry)
        return result
    return wrapper

2. 整合到凯撒密码Facade类

将装饰器应用到加密、解密方法上,替代手动写入日志的逻辑:

class CaesarCipherFacade:
    def __init__(self):
        self._history = []

    @log_operation
    def encrypt(self, text, shift):
        encrypted = []
        for char in text:
            if char.isalpha():
                shift_base = ord('A') if char.isupper() else ord('a')
                encrypted_char = chr((ord(char) - shift_base + shift) % 26 + shift_base)
                encrypted.append(encrypted_char)
            else:
                encrypted.append(char)
        return ''.join(encrypted)

    @log_operation
    def decrypt(self, text, shift):
        # 解密等价于反向位移,直接复用加密逻辑
        return self.encrypt(text, -shift)

    def get_history(self):
        return self._history.copy()

3. 测试验证

运行以下代码验证日志功能:

# 实例化Facade类
cipher = CaesarCipherFacade()

# 执行加密、解密操作
cipher.encrypt("Hello Stack!", 5)
cipher.decrypt("Mjqqt Xyfxy!", 5)

# 打印操作日志
for entry in cipher.get_history():
    print(entry)

输出结果:

{'operation': 'encrypt', 'text': 'Hello Stack!', 'shift': 5, 'result': 'Mjqqt Xyfxy!'}
{'operation': 'decrypt', 'text': 'Mjqqt Xyfxy!', 'shift': 5, 'result': 'Hello Stack!'}

关键说明

  • 装饰器的wrapper函数第一个参数为self,因为被装饰的是类的实例方法,调用时会自动传入实例对象,因此能直接访问self._history。
  • 用*args和**kwargs兼容位置参数与关键字参数的调用方式,确保能正确提取text和shift参数。
  • 日志条目采用字典格式存储,便于后续读取与解析,你也可以根据需求调整为字符串格式。

内容的提问来源于stack exchange,提问作者yanky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:12:33