Python-何时调用__repr__

__repr__ 是 Python 中的一个特殊方法,当需要得到一个对象的“官方字符串表示”时会被调用。以下是常见调用 __repr__ 的场景:



1. 直接在交互式解释器中输入对象时

如果在 Python 的交互式解释器中直接输入对象的变量名,而不是显式调用 print,解释器会调用 __repr__ 方法来显示该对象的字符串表示。

class Cat:
    def __repr__(self):
        return "Cat('Tom')"

cat = Cat()
cat  # 会调用 cat.__repr__()
# 输出: Cat('Tom')


2. 使用内置函数 repr() 时

显式调用 repr(obj) 会触发对象的 __repr__ 方法。

class Dog:
    def __repr__(self):
        return "Dog('Spike')"

dog = Dog()
print(repr(dog))  # 调用 dog.__repr__()
# 输出: Dog('Spike')


3. 容器类型中包含该对象时

当对象出现在如列表、字典、集合等容器类型中时,Python 会调用 __repr__ 方法来显示对象。

class Bird:
    def __repr__(self):
        return "Bird('Tweety')"

bird = Bird()
print([bird])  # 调用 bird.__repr__()
# 输出: [Bird('Tweety')]


4. 用于调试信息

__repr__ 的设计初衷是提供“尽可能详细”的对象信息,便于调试,因此在一些调试工具或日志中会自动调用 __repr__



5. 当 __str__ 未定义时

如果一个对象同时定义了 __str____repr__print(obj) 会优先调用 __str__。但如果 __str__ 未定义,print(obj) 会退而调用 __repr__

class Fish:
    def __repr__(self):
        return "Fish('Goldfish')"

fish = Fish()
print(fish)  # __str__ 未定义,调用 __repr__()
# 输出: Fish('Goldfish')


总结

  • 设计目标__repr__ 方法的返回值应尽量清晰、完整,通常是一个有效的 Python 表达式,能用来重新创建对象。
  • 触发时机repr(obj)、交互式环境直接输入对象、容器类型打印、__str__ 缺失时调用等。

如果要让对象在用户友好的上下文中显示,比如 print 输出,可以考虑同时定义 __str__,提供更简洁的输出。

文章标签:

评论(0)