python __repr__和__str__区别
1. __repr__
__repr__
方法由 repr()
内置函数调用,用于计算对象的“正式”字符串表示形式。理想情况下,这个字符串应该看起来像一个有效的 Python 表达式,可以在适当的环境下用来重新创建具有相同值的对象。如果这不可能实现,那么 __repr__
应该返回一个描述对象状态的字符串。返回值必须是一个字符串对象。
这个方法通常用于调试,因此重要的是,表示形式必须信息丰富且明确。例如,如果定义了一个类并且只定义了 __repr__
而没有定义 __str__
,那么当需要该类的实例的“非正式”字符串表示形式时,__repr__
也会被使用。
class Student:def __init__(self, name, age):self._name = nameself._age = agedef __repr__(self):return f"{self.__class__.__name__}({self._name!r}, {self._age!r})"
这里使用了 !r
格式化字符串,它会调用 repr()
函数来获取变量的字符串表示形式,这通常用于确保输出的字符串是可读的。
2. __str__
__str__
方法由 str()
、format()
和 print()
内置函数调用,用于计算对象的“非正式”或易于打印的字符串表示形式。与 __repr__
不同,__str__
不需要返回有效的 Python 表达式:可以使用更直观或更简洁的表示形式。
def __str__(self):return f"a student named {self._name}"
这种方法的目的是为用户提供一个易于阅读的字符串,通常在打印对象时使用。
3. 使用 !s
和 !r
在 Python 中,格式化字符串时可以使用 !s
和 !r
来转换值。!s
调用 str()
函数,而 !r
调用 repr()
函数。这在需要在格式化之前转换值时非常有用。
print(f"Student name: {student!r}") # 使用 repr()
print(f"Student name: {student!s}") # 使用 str()
这允许开发者在打印或显示对象时,根据需要选择更正式或更非正式的表示形式。
希望这能帮助你更好地理解 __repr__
和 __str__
方法的用途和实现方式。