在 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()
还是直接在解释器中查看对象,都会得到详细和有用的字符串表示。