__repr__ and __str__ 的那些事

原创
2018/08/22 17:34
阅读数 5

talk is cheap,show me the code

示例说明

预备知识:str()内置函数使用 _str_ 显示对象的字符串表示形式,而 repr()内置函数使用 _repr_显示对象

使用缺省 _str_ 和 _repr_

  
    
  
  
  1. class Test:

  2.    pass

  3. print(str(Test()))

  4. print(repr(Test()))

  5. print(str(Test()) == repr(Test()))

输出结果:

  
    
  
  
  1. >>> print(str(Test))

  2. <class '__main__.Test'>

  3. >>> print(repr(Test))

  4. <class '__main__.Test'>

  5. >>> print(repr(Test) == str(Test))

  6. True

通过上述例子我们可以知道: python 默认有对 __repr____str__ 的实现方法,当两者均使用缺省定义的情况下 __repr__ 是等同于 __str__ 

两者只定义一种

定义 _str_

  
    
  
  
  1. class Test1:

  2.    def __str__(self):

  3.        return "Test1.__str__"

  4. print(str(Test1()))

  5. print(repr(Test1()))

  6. print(str(Test1()) == repr(Test1()))

输出结果如下:

  
    
  
  
  1. >>> print(str(Test1()))

  2. Test1.__str__

  3. >>> print(repr(Test1()))

  4. <__main__.Test1 object at 0x000001F9B3DCD518>

  5. >>> print(str(Test1()) == repr(Test1()))

  6. False

这里别急,让我们看下另外的例子

定义 _repr_

  
    
  
  
  1. class Test2:

  2.    def __repr__(self):

  3.        return "Test1.__str__"

  4. print(str(Test2()))

  5. print(repr(Test2()))

  6. print(str(Test2()) == repr(Test2()))

输出结果如下:

  
    
  
  
  1. >>> print(str(Test2()))

  2. Test2.__repr__

  3. >>> print(repr(Test2()))

  4. Test2.__repr__

  5. >>> print(str(Test2()) == repr(Test2()))

  6. True

通过上述两个例子的对比,我们可以知道: 当仅定义 _repr_ 的时候, _repr_ == _str_,  但是仅定义 _str__ 的情况下,两者相等

两者均定义

  
    
  
  
  1. class Test3:

  2.    def __repr__(self):

  3.        return "Test3.__repr__"

  4.    def __str__(self):

  5.        return "Test3.__str__"

  6. print(str(Test3()))

  7. print(repr(Test3()))

  8. print(str(Test3()) == repr(Test3()))

输出的结果如下:

  
    
  
  
  1. >>> print(str(Test3()))

  2. Test3.__str__

  3. >>> print(repr(Test3()))

  4. Test3.__repr__

  5. >>> print(str(Test3()) == repr(Test3()))

  6. False

显然当两者均定义的时候,会各自使用自己的方法

两者的区别

  1. _str_ 用于为最终用户创建输出,而 _repr_ 主要用于调试和开发。 _repr_ 的目标是明确无误,_str_ 是可读的

  2. _repr_ 用于推断对象的"官方"字符串表示形式(包含有关对象的所有信息的表示, _str_ 用于推断对象的“非正式”字符串表示形式(对打印对象有用的表示形式

再通过一个例子说明问题:

  
    
  
  
  1. import datetime

  2. today = datetime.datetime.now()

  3. print str(today)

  4. print repr(today)  

输出结果如下:

  
    
  
  
  1. >>> print(str(today))

  2. 2018-08-22 16:52:37.403320

  3. >>> print(repr(today))

  4. datetime.datetime(2018, 8, 22, 16, 52, 37, 403320)

参考链接

https://stackoverflow.com/questions/1436703/difference-between-str-and-repr

https://www.geeksforgeeks.org/str-vs-repr-in-python/

https://docs.python.org/3/reference/datamodel.html#object.__repr__

https://docs.python.org/3/reference/datamodel.html#object.__str__


========================

     我是Leetao,写有趣的代码,做有趣的事  ,欢迎关注我的公共号              

========================

本文分享自微信公众号 - 桃子的学习笔记(LeeTaoThinks)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部