在 Python 中,__str__ 方法和 __repr__ 方法都是用于定义对象的字符串表示方式,但它们有不同的用途和规范。
__str__ 方法
- 用途:提供一个对象的可读性好的字符串表示,适用于展示给最终用户。
- 设计目标:生成一个对用户友好的字符串表示。
- 使用场景:当使用
print()或str()函数时会调用__str__方法。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'{self.name}, {self.age} years old'
__repr__ 方法
- 用途:提供一个对象的官方字符串表示,通常包含足够的信息来精确地重建该对象。理想情况下,该字符串表示可以传递给
eval()来重新创建对象。 - 设计目标:生成一个对开发者友好的字符串表示,用于调试和开发。
- 使用场景:当直接在解释器中查看对象或使用
repr()函数时会调用__repr__方法。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person(name={self.name!r}, age={self.age!r})'
选择 __repr__ 方法的原因
如果必须在 __str__ 和 __repr__ 中二选一,推荐实现 __repr__ 方法,主要有以下几个原因:
- 信息完整性:
__repr__方法设计的目标是提供尽可能多的信息,有助于调试和开发。 - 开发便利性:当对象在解释器中被直接调用时,
__repr__的输出会更有用。 - 广泛应用:如果只实现
__repr__方法且没有定义__str__方法,__repr__方法也会在调用str()和print()函数时被使用。
示例
下面是一个实现了 __repr__ 方法的示例类:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person(name={self.name!r}, age={self.age!r})'
# 使用示例
p = Person("Alice", 30)
print(p) # 输出:Person(name='Alice', age=30)
print(str(p)) # 输出:Person(name='Alice', age=30)
print(repr(p)) # 输出:Person(name='Alice', age=30)
这样,无论是使用 print()、str() 还是直接在解释器中查看对象,都会得到详细和有用的字符串表示。

1130

被折叠的 条评论
为什么被折叠?



