当Python类构造函数含**kwargs时,如何实现__repr__方法?
实现Thing类的__repr__方法
要让Thing类的实例生成符合Python语法的字符串表示(可通过eval()重建实例),可以按以下方式实现__repr__方法:
实现思路
- 提取必选参数
a和b的值,用repr()格式化以保证语法正确性; - 从实例的
__dict__中排除a和b,剩余属性即为通过**kwargs传入的额外参数; - 将额外属性格式化为
key=repr(value)的形式,对键名排序以保证输出顺序稳定; - 把所有参数拼接成
Thing(参数1, 参数2, 额外参数...)的格式字符串。
完整代码
class Thing: def __init__(self, a, b, **kwargs): self.a = a self.b = b self.__dict__.update(kwargs) def __repr__(self): # 处理必选参数 param_parts = [repr(self.a), repr(self.b)] # 筛选并格式化额外关键字参数 extra_attrs = {k: v for k, v in self.__dict__.items() if k not in ('a', 'b')} param_parts.extend(f"{key}={repr(val)}" for key, val in sorted(extra_attrs.items())) # 拼接最终字符串 return f"Thing({', '.join(param_parts)})" # 测试示例 thing1 = Thing(6, 5, color="red") print(repr(thing1)) # 输出: Thing(6, 5, color='red') thing2 = Thing(10, 20, size=15, shape="circle") print(repr(thing2)) # 输出: Thing(10, 20, shape='circle', size=15)
说明
- 使用
repr()处理参数值,确保字符串、数字等类型都符合Python语法规范; - 对额外属性的键名排序,避免因字典插入顺序(Python3.7+为插入顺序)导致的输出不一致;
- 生成的字符串可直接通过
eval()重新创建等价实例,符合__repr__方法的设计初衷。
内容的提问来源于stack exchange,提问作者a11
相关产品推荐
相关产品推荐

