Python中__repr__
和__str__
方法的区别
你好,我是悦创。
问题
__repr__
和__str__
有什么区别?
解答
__repr__
和__str__
方法在Python中都用于为对象提供字符串表示形式,但它们之间存在一些区别,主要体现在用途和实现上:
-
用途:
__repr__
:主要用于调试和开发。__repr__
方法的目标是返回一个字符串,用于准确地描述如何重新创建对象。这样,在解释器中输入对象名字时,就会看到这个字符串。__repr__
方法的返回值通常适用于开发人员,以便更好地理解对象的内部结构和状态。__str__
:主要用于最终用户。__str__
方法的目标是返回一个用户友好的字符串,以便于阅读和理解。这个字符串通常用于向用户展示有关对象的信息。当你调用print()
函数或使用str()
函数时,Python会自动调用类的__str__
方法。
-
实现:
- 如果类中只实现了
__repr__
方法,而没有实现__str__
方法,那么当调用print()
或str()
时,Python会使用__repr__
方法的返回值作为备选。 - 如果类中同时实现了
__repr__
和__str__
方法,那么__repr__
方法将用于解释器中的对象表示以及repr()
函数,而__str__
方法将用于print()
函数和str()
函数。 - 如果类中没有实现
__repr__
方法,Python会使用默认的实现,通常返回一个字符串,包含类名和对象在内存中的地址。
- 如果类中只实现了
下面是一个例子,展示了实现__repr__
和__str__
方法的区别:
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person('{self.name}', {self.age})"def __str__(self):return f"{self.name}, {self.age}岁"person1 = Person("张三", 25)# 输出对象的字符串表示形式
print(repr(person1)) # 输出:Person('张三', 25)
print(person1.__repr__()) # 输出:Person('张三', 25)# 输出用户友好的字符串表示形式
print(str(person1)) # 输出:张三, 25岁
print(person1.__str__()) # 输出:张三, 25岁
print(person1) # 输出:张三, 25岁(因为实现了__str__方法,此处使用__str__方法的结果)
在这个例子中,我们定义了一个Person
类,它包含__repr__
和__str__
两个方法。__repr__
方法返回一个用于重新创建对象的字符串,而__str__
方法返回一个用户友好的字符串。这样,当我们使用repr()
函数或直接输入对象名字时,我们会看到__repr__
方法返回的字符串。而当我们使用print()
函数或str()
函数时,我们会看到__str__
方法返回的字符串。
总之,__repr__
和__str__
方法在Python中都用于为对象提供字符串表示形式,但它们分别针对不同的使用场景。__repr__
方法主要用于调试和开发,返回一个准确描述如何重新创建对象的字符串,而__str__
方法主要用于最终用户,返回一个用户友好的字符串。在实现时,如果类中只实现了__repr__
方法,那么在调用print()
或str()
时,Python会使用__repr__
方法的返回值作为备选。如果类中同时实现了__repr__
和__str__
方法,则分别在不同的场景下调用。