__repr__和__str__
2020-06-12 本文已影响0人
mmee
二者的目的不同:
-
__repr__
的目的是提供一种准确的无歧义的对象字符串表示形式,尽可能表达出如何用代码创建出这个被打印的对象,方便调试和记录日志,通常obj==eval(repr(obj))
,在使用repr时被调用。 -
__str__
的目的是给终端用户提供一种可读性更好的对象字符串表示形式。在使用 str函数或者print函数时被调用,返回的字符串对用户更友好。
class User:
def __init__(self,name,age):
self._name = name
self._age = age
def __str__(self):
return '%s,%s' % (self._name,self._age)
def __repr__(self):
return 'User(%r,%r)' % (self._name,self._age) #使用%s将返回User(zhangsan,10),无法创建对象
user = User('zhangsan',10)
print(repr(user))
print(str(user))
another = eval(repr(user)) #创建一个新的User对象
输出
User('zhangsan',10)
zhangsan,10
没有定义__repr__
和__str__
,str和repr输出结果相同
class MyClass:
pass
myclass = MyClass()
print(str(myclass))
print(repr(myclass))
print(myclass)
输出:
<__main__.MyClass object at 0x034418E0>
<__main__.MyClass object at 0x034418E0>
<__main__.MyClass object at 0x034418E0>
只定义__repr__
,__str__ == __repr__
。
如果只实现这两个特殊方法中的一个,repr 是更好的选择,因为如果一个对象没有 str 函数,而 Python 又需要调用它的时
候,解释器会用 repr 作为替代。
class MyClass:
def __repr__(self):
return "hello"
输出:
hello
hello
hello
只定义__str__
,__repr__!=__str__
class MyClass:
def __str__(self):
return "hello"
hello
<__main__.MyClass object at 0x03720910>
hello