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

Python中能否为自定义类实现多种repr策略并支持递归应用?

在Python中实现多策略递归repr的方案

要实现自定义类的多种递归repr策略,核心是编写一个递归遍历数据结构的通用函数,同时让自定义类的不同repr方法内部调用该函数,传递对应的策略参数。以下是具体实现:

步骤1:定义支持多策略的自定义类

修改类的repr方法,让内部嵌套对象通过递归函数处理,而非默认的repr():

class SomeClass:
    def __init__(self, objects):
        self._objects = objects
    
    def __repr__(self):
        # 默认策略:用递归函数处理内部对象
        return f"Recursive default repr: {recursive_repr(self._objects)}"
    
    def __alternate_repr__(self):
        # 替代策略:指定用__alternate_repr__处理嵌套对象
        return f"Recursive alternate repr: {recursive_repr(self._objects, method_name='__alternate_repr__')}"

步骤2:编写递归处理函数

这个函数会遍历常见容器类型(列表、字典、元组等),对每个元素应用指定的repr策略:

def recursive_repr(obj, method_name='__repr__'):
    # 处理列表
    if isinstance(obj, list):
        elements = ', '.join(recursive_repr(item, method_name) for item in obj)
        return f'[{elements}]'
    # 处理元组(兼容单元素元组的格式)
    elif isinstance(obj, tuple):
        elements = ', '.join(recursive_repr(item, method_name) for item in obj)
        return f'({elements},)' if len(obj) == 1 else f'({elements})'
    # 处理字典
    elif isinstance(obj, dict):
        items = []
        for key, val in obj.items():
            key_str = recursive_repr(key, method_name)
            val_str = recursive_repr(val, method_name)
            items.append(f'{key_str}: {val_str}')
        return f'{{{", ".join(items)}}}'
    # 处理集合
    elif isinstance(obj, set):
        elements = ', '.join(recursive_repr(item, method_name) for item in obj)
        return f'{{{", ".join(elements)}}}'
    # 处理自定义类或其他基础类型
    else:
        # 如果对象支持指定策略,调用对应方法;否则用默认repr
        if hasattr(obj, method_name):
            return getattr(obj, method_name)()
        else:
            return repr(obj)

步骤3:测试效果

a = SomeClass(["list", "of", "values"])
b = SomeClass(dict(nested_class=a))
c = SomeClass([b, 1, "..."])

# 使用默认repr策略
print(repr(c))
# 输出:Recursive default repr: [Recursive default repr: {'nested_class': Recursive default repr: ['list', 'of', 'values']}, 1, '...']

# 使用替代repr策略
print(recursive_repr(c, method_name='__alternate_repr__'))
# 输出:Recursive alternate repr: [Recursive alternate repr: {'nested_class': Recursive alternate repr: ['list', 'of', 'values']}, 1, '...']

关键说明

  • 容器类型必须手动遍历处理:默认的容器repr()会直接调用元素的__repr__,无法切换策略,因此需要递归函数逐个处理元素。
  • 自定义类的策略方法需联动递归函数:每个策略方法内部要调用recursive_repr并传递对应的策略名称,才能让嵌套对象继承当前策略。
  • 兼容基础类型:对于不支持自定义策略的对象(如字符串、数字),自动回退到默认repr()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:07:25