如何正确修改Python的__repr__方法以实现对象的正确表示?
问题解决:迭代器对象的__repr__显示内存地址
问题原因
你遇到的情况是因为itertools.combinations()返回的是迭代器对象,这类对象的默认__repr__实现只会输出内存地址,不会展开显示内部元素——这是迭代器的惰性特性导致的,它不会提前生成所有组合,只有在迭代时才会逐个生成。而你类内部创建的列表等序列对象,它们的__repr__会自动展开显示内容,所以看起来“正常”。
解决方案
要让__repr__显示组合的具体内容,只需要把迭代器转换成列表(或者其他可显示内容的序列类型)即可,有两种常见方式:
方式1:修改__repr__方法,在格式化时转换为列表
直接在返回字符串前,把get_combinations的结果转成列表:
def __repr__(self): return f'{list(self.get_combinations(2))}'
方式2:修改get_combinations方法,返回列表而非迭代器
如果你的场景中不需要迭代器的惰性特性,可以直接在方法内部转换:
def get_combinations(self, r): return list(it.combinations(self.sorted_names, r))
验证效果
修改后运行代码,print(repr(a))就会输出类似[('Alice', 'Bob'), ('Alice', 'Charlie'), ...]的具体组合内容,而不是内存地址。
内容的提问来源于stack exchange,提问作者Vaireanu Gabi
相关产品推荐
相关产品推荐

