目录
1. __repr__(self)
该方法在 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
2. __str__(self)
该方法在 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)