[!NOTE] 说白了,这两者区别都是自己在类中定义的而已。只要自己编写的时候,描述的方式不一样,就区分出了__repr__以及__str__。都是自己定义的
是的,如果你在类中定义了 __str__ 方法,那么当你使用 print(对象) 或 str(对象) 时,Python 会自动调用你定义的 __str__ 方法,返回你指定的字符串表示。
__str__ 方法的作用:
__str__是一个魔法方法,用于定义对象的“友好”字符串表示,通常是给用户看的。- 当你调用
print(对象)或str(对象)时,Python 会隐式调用对象的__str__方法。 - 如果没有定义
__str__方法,Python 会默认使用__repr__方法(如果有),或者返回类似<__main__.ClassName object at 0x0000...>这样的字符串。
示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'{self.name} is {self.age} years old.'
# 创建一个 Person 对象
p = Person('Alice', 30)
# 打印对象
print(p) # 输出: Alice is 30 years old.
解释:
- 当你使用
print(p)时,Python 会调用p.__str__(),然后将返回的字符串打印出来。 - 在这个例子中,
p.__str__()返回'Alice is 30 years old.',因此该字符串被打印出来。
没有定义 __str__ 时的行为:
如果你没有在类中定义 __str__ 方法,Python 会调用 __repr__ 方法(如果定义了),或者使用默认的实现,通常会返回对象的内存地址,例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 创建一个 Person 对象
p = Person('Alice', 30)
# 打印对象
print(p) # 输出: <__main__.Person object at 0x7ff9b5f9f640>
因此,如果你希望 print(对象) 时输出更具可读性的信息,定义 __str__ 方法是一个很好的方式。
__repr__ 和 __str__ 都是用于对象的字符串表示的特殊方法,但它们的用途和目标稍有不同:
__str__:面向用户,提供可读性强的字符串表示,用于显示给用户。__repr__:面向开发者,通常用于调试,应该返回一个尽可能准确和有用的字符串,通常会是一个可以用来重新创建对象的表达式。
当你调用 repr(对象) 或直接在交互式解释器中输入对象名时,Python 会调用 __repr__。如果没有定义 __str__,但定义了 __repr__,那么 print(对象) 也会调用 __repr__。
__repr__ 的使用场景:
__repr__应该返回一个尽可能准确描述对象的字符串。- 理想情况下,
__repr__返回的字符串应该是合法的 Python 表达式,能够用来重建这个对象(尽可能地)。
示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
def __str__(self):
return f'{self.name} is {self.age} years old.'
- 使用
repr():p = Person('Alice', 30) print(repr(p)) # 输出: Person(name='Alice', age=30) - 交互式解释器: 在交互式 Python 环境中,如果你只输入对象名
p,它也会调用__repr__:p # 输出: Person(name='Alice', age=30) print()和__str__:print(p) # 输出: Alice is 30 years old.
__repr__ 和 __str__ 的区别:
__repr__:主要用于开发和调试。返回的字符串应该尽可能准确,并有助于重新构建对象。__str__:主要用于用户输出。返回的字符串应该尽可能简洁和可读。
没有定义 __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}', age={self.age})"
p = Person('Alice', 30)
print(p) # 输出: Person(name='Alice', age=30)
示例:__repr__ 的实际意义:
-
如果我们希望
__repr__返回一个能用于重新创建对象的表达式,那么通过eval(),可以重新构造出同样的对象(前提是类和环境存在):p_repr = repr(p) p_new = eval(p_repr) print(p_new) # 输出: Person(name='Alice', age=30)这证明了
__repr__可以生成一个表达式,能重新创建该对象。
总结:
__repr__主要是给开发者看的,用于调试和记录。__str__主要是给用户看的,提供更加友好的输出格式。