目录
该方法在 repr() 上被调用,交互响应,嵌套出现;
如果一个类没有定义 __str__(),则该方法也在 str(object) 、print() 上被调用;
repr(object):
- repr() 是 Python 的内置函数,返回对象的可打印形式字符串。对于很多类型而言,本函数试图返回的字符串,会与将对象传给 eval() 所生成的结果相同;
- 不然,结果就是一个尖括号包裹的字符串,包含了对象类型名称及其附加信息,附加信息通常包括对象的名称和内存地址。通过定义 __repr__() 方法,类可以控制本函数将为实例返回的内容。
此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的;
重构 __repr__() 方法后,调试时直接输入实例对象名回车,即返回方法执行结果。
- #创建使用默认 __repr__() 的类和实例
- class Test:
- pass
- test1 = Test()
-
- #直接输入实例对象名回车,返回对象的可打印形式字符串
- test1
- <__main__.Test object at 0x0000024C3CB1DBE0>
-
- #创建重构 __repr__() 的类和实例
- class Test:
- def __init__(self, name = ''):
- self.name = name
-
- def __repr__(self):
- return f'objectname:{self.name}'
- test1 = Test('test1')
-
- #直接输入实例对象名回车,或调用 str()、print() 函数,成功调用重构的 __repr__() 方法
- test1
- objectname:test1
- str(test1)
- 'objectname:test1'
- print(test1)
- objectname:test1
该方法在 str(object) 以及内置函数 format() 和 print() 上被调用,通过以生成一个对象的“非正式”或格式良好的字符串表示;
返回值必须为一个字符串对象,否则调用 str(self)、print(self) 时报错;
此方法与 object.__repr__() 的不同点在于 __str__() 并不预期返回一个有效的 Python 表达式:可以使用更方便或更准确的描述信息;内置类型 object 所定义的默认实现会调用 object.__repr__()。
- #创建重构 __repr__()、 __str__() 的类和实例
- class Test2:
- def __init__(self, name=''):
- self.name = name
-
- def __repr__(self):
- return 'Hi, everyone!'
-
- def __str__(self):
- return f'objectname:{self.name}'
-
- test2 = Test2('test2')
-
- #调用 repr()、str()、print(),成功调用重构方法
- test2
- Hi, everyone!
- str(test2)
- 'objectname:test2'
- print(test2)
- objectname:test2
-
- #创建重构返回非字符串的 __str__() 的类和实例
- class Test2:
- def __init__(self, name=''):
- self.name = name
-
- def __str__(self):
- return 1234
-
- #调用 repr() 正常
- test2 = Test2()
- test2
- <__main__.Test2 object at 0x0000022F161B1670>
-
- #调用 str()、print() 函数,报错
- print(test2)
- Traceback (most recent call last):
- File "<input>", line 1, in <module>
- TypeError: __str__ returned non-string (type int)
-
- str(test2)
- Traceback (most recent call last):
- File "<input>", line 1, in <module>
- TypeError: __str__ returned non-string (type int)