Python __str__ 和 __repr__
在Python中,__str__
和 __repr__
是两个非常重要的特殊方法,它们用于定义对象的字符串表示形式,但它们的用途和场景稍有不同:
__str__
方法
__str__
方法提供了对象的“人性化”字符串表示,它的目的是为了方便人类阅读和理解。当你使用 print()
函数打印一个对象,或者直接将对象用在字符串环境中(例如使用 %s
格式化字符串时),Python 会调用这个方法来获取对象的字符串形式。
理想的 __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" p = Person("Alice", 30) print(p) # 输出: Alice, 30 years old
__repr__
方法
__repr__
方法提供了对象的“官方”字符串表示,它的目的是为程序员提供一个准确且无歧义的对象描述,以便于调试和开发。当一个对象在交互式环境中未被正确格式化展示时(例如在Python解释器中直接输入对象名称),
Python 会调用 __repr__
方法来获取该对象的字符串表示。__repr__
的输出应该包含足够的信息,使得有经验的程序员能够重现这个对象。
理想的 __repr__
字符串应该是合法的Python表达式,这意味着在很多情况下,通过 eval()
执行 __repr__
的返回值应该能够得到一个与原对象相等的新对象。
class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"Person('{self.name}', {self.age})" p = Person("Alice", 30) print(repr(p)) # 输出: Person('Alice', 30)
总结来说,__str__
更关注可读性和用户友好性,而 __repr__
则侧重于精确性和可重构性。在实际编程中,根据需要可以定义其中一个或同时定义两者,以满足不同的应用场景。