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

如何实现装饰器在类方法执行后调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:25:18