如何使用print()打印类的实例?
当我尝试用 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
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__
。