[!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__ 主要是给用户看的,提供更加友好的输出格式。