如何为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
相关产品推荐
相关产品推荐

