如何使用print()打印类的实例?

813 投票
12 回答
1396290 浏览
提问于 2025-04-15 14:54

当我尝试用 print 打印一个类的实例时,输出结果是这样的:

>>> class Test():
...     def __init__(self):
...         self.a = 'foo'
...
>>> print(Test())
<__main__.Test object at 0x7fc9a9e36d60>

我该怎么做才能让 print 显示一些自定义的内容(比如包含 a 属性值的内容)呢?也就是说,我如何定义类的实例在被打印时的样子(它们的 字符串表示)?


如果你想定义 类本身 的行为(比如让 print(Test) 显示一些自定义内容,而不是 <class __main__.Test> 或类似的东西),可以查看 这个链接。(实际上,方法基本相同,但应用起来会更复杂一些。)

12 个回答

114

如果你遇到像 @Keith 这样的情况,你可以试试:

print(a.__dict__)

这可能不是我认为的好写法,但如果你只是想调试一下,那这样做应该能达到你的目的。

187

正如Chris Lutz所解释的,这由你类中的__repr__方法来定义。

根据repr()的文档:

对于许多类型,这个函数会尝试返回一个字符串,这个字符串如果传给eval(),会生成一个值相同的对象。否则,这个表示会是一个用尖括号包围的字符串,里面包含对象的类型名称以及通常还包括对象的名称和地址等额外信息。一个类可以通过定义__repr__()方法来控制它的实例返回什么。

给定以下类Test:

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return f"<Test a:{self.a} b:{self.b}>"

    def __str__(self):
        return f"From str method of Test: a is {self.a}, b is {self.b}"

在Python命令行中,它会这样表现:

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print(repr(t))
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

如果没有定义__str__方法,print(t)(或者print(str(t)))将会使用__repr__的结果。

如果没有定义__repr__方法,那么就会使用默认的,这个默认值大致等同于

def __repr__(self):
    cls = self.__class__
    return f"<{cls.__module_}.{cls.__qualname__} object at {id(self)}>"
921
>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

__str__ 方法是在你打印一个对象时被调用的,而 __repr__ 方法是在你使用 repr() 函数时被调用的(或者当你在交互式提示符下查看它时)。

如果没有定义 __str__ 方法,Python 会打印 __repr__ 的结果。如果你定义了 __str__ 但没有定义 __repr__,Python 会使用上面提到的内容作为 __repr__,但打印时仍然会使用 __str__

撰写回答