美文网首页
__repr__和__str__

__repr__和__str__

作者: mmee | 来源:发表于2020-06-12 17:12 被阅读0次

    二者的目的不同:

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

          本文链接:https://www.haomeiwen.com/subject/fowgtktx.html