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

如何在Python类的__enter__方法中重写实例的__exit__方法?

解决Python中在__enter__内动态修改__exit__方法的问题

你的代码之所以不生效,是因为Python的**特殊方法(双下划线方法)**是在类级别查找的,with语句调用__exit__时,会直接从实例的类里查找,而不是读取实例本身的属性。直接给self.__exit__赋值不会被with语句识别到。

下面提供两种可行的实现方式:

方法一:用实例属性存储自定义退出逻辑

在原__exit__方法里判断并调用自定义逻辑,这种方式简单直观,适合大多数场景:

class TestClass:
    def __enter__(self):
        # 这里可以根据条件动态设置不同的退出逻辑
        self._custom_exit = lambda *_: print("exit override")
        return self

    def __exit__(self, *args):
        # 优先执行自定义逻辑,没有则用默认行为
        if hasattr(self, "_custom_exit"):
            return self._custom_exit(*args)
        print("exiting")

with TestClass() as test:
    pass

方法二:动态替换实例的类(创建临时子类)

如果不想在原__exit__里加判断,可以给实例动态替换一个临时子类,在子类里重写__exit__:

class TestClass:
    def __enter__(self):
        # 根据条件创建临时子类,重写__exit__方法
        class TempSubclass(self.__class__):
            def __exit__(self, *args):
                print("exit override")
        # 将当前实例的类替换为临时子类
        self.__class__ = TempSubclass
        return self

    def __exit__(self, *args):
        print("exiting")

with TestClass() as test:
    pass

两种方式都能实现动态修改退出逻辑的需求:方法一更轻量,无需修改类结构;方法二更彻底地替换了__exit__的实现,适合完全覆盖默认行为的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:20:29