如何实现装饰器在类方法执行后调用self.save()方法
自动保存类方法的装饰器实现
你的代码里有两个关键问题导致装饰器失效:
- 装饰器最后返回的是
inner(),这会直接执行内部函数而非返回它作为装饰后的方法,应该返回inner本身。 - 内部函数里的
self未定义,类方法的第一个参数就是实例对象,可通过args[0]获取。
正确的装饰器写法
def auto_save(func): def inner(*args, **kwargs): # 执行原方法逻辑 result = func(*args, **kwargs) # 获取类实例(类方法第一个参数为self) instance = args[0] # 调用实例的save方法 instance.save() return result return inner
在Wardrobe类中使用装饰器
import json class Wardrobe: def __init__(self, filepath): self.filepath = filepath with open(self.filepath, 'r') as f: self.wardrobe = json.load(f) @auto_save # 给duplicate方法添加自动保存功能 def duplicate(self, index: int): item = self.wardrobe['all'][index] self.wardrobe['all'].append(item) def save(self): with open(self.filepath, 'w') as f: json.dump(self.wardrobe, f, indent=4)
扩展:异常场景下的保存
如果需要确保无论原方法执行成功还是抛出异常,都执行保存操作,可以给装饰器加上try...finally:
def auto_save(func): def inner(*args, **kwargs): instance = args[0] try: result = func(*args, **kwargs) return result finally: # 无论是否报错都执行保存 instance.save() return inner
这个装饰器可以直接复用在其他需要自动保存的方法上,比如新增衣物、删除衣物的方法,只需在方法上方添加@auto_save即可,不用在每个方法里重复写self.save()。
内容的提问来源于stack exchange,提问作者smyril
相关产品推荐
相关产品推荐

