Python 实现一个类,通过 repr 方法返回自定义对象的描述
快速解决
要让自定义类的对象在调试时显示完整信息,只需在类中定义 __repr__ 方法并返回字符串表达式。这个方法能解决"对象打印时显示默认地址信息"的问题。
常用方法
| 方法 | 作用 | 使用频率 |
|---|---|---|
__repr__ 重写 |
定义对象的字符串表示 | ⭐⭐⭐⭐⭐ |
f-string 格式化 |
动态拼接对象属性 | ⭐⭐⭐⭐ |
repr() 函数调用 |
保证嵌套对象正确显示 | ⭐⭐⭐ |
__str__ 配合使用 |
区分用户和调试场景 | ⭐⭐ |
__dict__ 属性访问 |
快速生成默认表示 | ⭐ |
详细说明
基本语法结构
class Person:
def __init__(self, name, age):
self.name = name # 初始化姓名属性
self.age = age # 初始化年龄属性
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})" # 标准字符串表示格式
返回类型要求
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return "Point(x={}, y={})".format(self.x, self.y) # 必须返回字符串类型
参数自动解析
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __repr__(self):
return f"{self.title!r} by {self.author!r} ({self.pages} pages)" # 使用 !r 自动调用 repr()
高级技巧
动态属性处理
class DynamicClass:
def __init__(self, **kwargs):
self.__dict__.update(kwargs) # 接收任意参数
def __repr__(self):
attrs = ', '.join(f"{k}={v!r}" for k, v in self.__dict__.items()) # 动态生成属性列表
return f"{self.__class__.__name__}({attrs})" # 通用表示方法
继承链处理
class Animal:
def __init__(self, species):
self.species = species
class Dog(Animal):
def __init__(self, name, breed):
super().__init__("犬科") # 调用父类初始化
self.name = name
self.breed = breed
def __repr__(self):
return f"{super().__repr__()} {self.name} ({self.breed})" # 保留父类信息
调试辅助模式
class Debuggable:
def __repr__(self):
return f"<{self.__class__.__name__} object at {hex(id(self))}>" # 手动实现默认行为
class Product(Debuggable):
def __init__(self, name, price):
self.name = name
self.price = price
常见问题
Q1: 为什么使用双下划线方法?
A: Python 的双下划线方法是特殊方法约定,__repr__ 是 Python 内置的字符串表示协议,使用时需注意方法名的书写规范。
Q2: repr 和 str 的区别?
A: __repr__ 用于调试(显示完整构造信息),__str__ 用于展示(显示用户友好信息)。
class Car:
def __repr__(self):
return "Car('Tesla', 2022)" # 适合直接复制粘贴创建对象
def __str__(self):
return "Tesla 2022款电动车" # 适合用户阅读
Q3: 如何处理嵌套对象?
A: 在格式字符串中调用 repr() 函数确保嵌套对象完整显示
class Container:
def __init__(self, items):
self.items = items
def __repr__(self):
items_repr = repr(self.items) # 保证列表正确表示
return f"Container({items_repr})"
核心应用场景
- 调试场景:当开发人员打印对象查看内部状态时
- 序列化需求:对象转换为字符串用于日志记录
- 容器类开发:确保包含自定义对象的列表/字典显示完整
最佳实践建议
- 优先实现
__repr__方法 - 使用 "类名(参数=值)" 标准格式
- 对用户输入参数使用
repr()保证准确性 - 在交互式解释器中测试效果
- 使用 Python 3.10+ 的
dataclass自动实现
总结
通过实现 __repr__ 方法,开发者可以完全掌控自定义类对象的字符串表示形式,这是 Python 对象调试和序列化的关键技巧。