(十二)对象的显示与调试表示
直接打印普通实例,默认表示通常难以看出记录内容。可以定义面向阅读的 __str__,以及用于查看对象信息的 __repr__:
# str 供正常显示,repr 保留类型名和字段,便于观察对象内容。
class Book:
def __init__(self, title, finished=False):
self.title = title
self.finished = finished
def __str__(self):
status = "已读" if self.finished else "未读"
return f"{self.title}({status})"
def __repr__(self):
return f"Book(title={self.title!r}, finished={self.finished!r})"
book = Book("Python")
print(book)
print(repr(book))
print([book])输出“Python(未读)”、Book(title='Python', finished=False),以及 [Book(title='Python', finished=False)]。print(book) 使用面向显示的字符串,列表展示内部元素时使用它们的 repr。f-string 中的 !r 表示先对这个值取得 repr,所以标题周围保留字符串引号。
两种方法都返回字符串,不直接在方法体里打印。前面数据类生成的显示方法是 __repr__;需要另外的阅读格式时,仍可以自己定义 __str__。