__repr__和__str__

二者的目的不同:

  • __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

你可能感兴趣的:(__repr__和__str__)