object.__str__ 和 object.__repr__ 有什么作用?警告:它与 Class.__str__ 和 Class.__repr__ 不同

What does object.__str__ and object.__repr__ do? Warning: It's not the same as Class.__str__ and Class.__repr__

class TestClass:
    def __init__(self):
        pass
    def __str__(self):
        return 'You have called __str__'
    def __repr__(self):
        return 'You have called __repr__'

a = TestClass()
print(object.__repr__(a))
print(object.__str__(a))

输出:

<__main__.TestClass object at 0x7fe175c547c0>
You have called __repr__

这两个函数有什么作用?


我的理解是调用str(a)returnsa.__str__()和调用repr(a)returnsa.__repr__()print(a) 还打印字符串 a.__str__() 因为正在进行隐式 str(a) 转换。

请注意,我的问题与另一个热门问题不重复;请参阅下面我的第一条评论。

该行为违反直觉;做 print(object.__str__(a)) 打印 repr 字符串而不是 str 字符串。

object class 为 __repr____str__ 方法提供默认实现。

  • object.__repr__显示对象的类型及其id(对象在C中的地址Python)

  • object.__str__(a) 呼叫 repr(a)。基本原理是,如果 __str__ 未在 class 中被覆盖,str(a) 将自动调用 repr(a) 使用可能的覆盖 __repr__。更确切地说,Python 语言参考/数据模型/特殊方法名称/基本定制的官方文档说:

    object.__str__(self)

    ...The default implementation defined by the built-in type object calls object.__repr__().

    ... 进而调用重写的 __repr__ 方法,就像 repr(object) 那样。

这正是此处发生的情况,因为您直接调用 object.__str__ 而这不是预期的。