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

如何为自定义对象列表实现上下文管理器?基于Bird类场景

实现支持自动清理元素的DisposableList

没问题,我来帮你搞定这个需求!你已经有了支持上下文管理的Bird类,现在只需要实现一个同样支持上下文管理的列表类,让它在with块结束时自动清理里面的每个元素。

实现思路

我们可以让DisposableList继承自Python内置的list,这样它天然拥有列表的所有功能,同时添加上下文管理器的两个核心方法:__enter__和__exit__:

  • 在__enter__中,遍历列表里的每个元素,如果元素是上下文管理器(有__enter__方法),就调用它的__enter__方法,和单个对象的with行为保持一致。
  • 在__exit__中,逆序调用每个元素的__exit__方法(如果存在),这样能保证清理顺序和初始化顺序相反,避免资源依赖问题(比如先初始化A再B,清理时先B再A)。

完整代码实现

class Bird(object):
    def __init__(self, name):
        self.name = name
    def __enter__(self):
        print("enter " + self.name)
        return self
    def __exit__(self, type, value, traceback):
        print("exit " + self.name)

class DisposableList(list):
    def __enter__(self):
        # 初始化每个上下文管理器元素
        for item in self:
            if hasattr(item, '__enter__'):
                item.__enter__()
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 逆序清理每个上下文管理器元素
        for item in reversed(self):
            if hasattr(item, '__exit__'):
                item.__exit__(exc_type, exc_val, exc_tb)
        # 返回False表示不抑制with块中的异常,让异常正常抛出
        return False

使用示例

with DisposableList([Bird("A"), Bird("B")]) as my_list:
    print("正在with块内操作...")
    print(f"列表包含 {len(my_list)} 个元素")
    print(f"第一个元素名称: {my_list[0].name}")

运行这段代码会输出:

enter A
enter B
正在with块内操作...
列表包含 2 个元素
第一个元素名称: A
exit B
exit A

额外说明

  • 兼容性强:如果列表里的元素不是上下文管理器(没有__enter__/__exit__方法),DisposableList也能正常使用,只会跳过这些元素的初始化和清理步骤,不会报错。
  • 异常处理:__exit__返回False是为了遵循Python上下文管理器的默认行为——不抑制with块中抛出的异常,让异常正常传递出去,方便你后续处理。
  • 自定义扩展:如果需要给DisposableList添加其他功能(比如元素过滤、自定义清理逻辑),直接在类里添加方法即可,完全不影响它的列表特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:18:54