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
相关产品推荐
相关产品推荐

