python中魔法方法__str__与__repr__的区别
提出問題
當我們自定義一個類時,打印這個類對象或者在交互模式下直接輸入這個類對象按回車,默認顯示出來的信息好像用處不大。如下所示
In [1]: class People: ...: def __init__(self, name, sex): ...: self.name = name ...: self.sex = sex ...: In [2]: p = People('xiaoming', 'male') In [3]: p Out[3]: <__main__.People at 0x7fd0df745400>In [4]: print(p) <__main__.People object at 0x7fd0df745400>可以發現,兩種方式顯示出來的信息都是對象所屬類的名稱以及對象所在的地址,而很多時候這不是我們想要的信息,此時我們可以通過重寫__str__和__repr__方法來定制我們想要的信息。
__str__與__repr__簡單介紹
__ str__ 和 __ repr__ 方法,是自定義類的字符串描述,當我們打印或查看某個對象時,最終看到的結果是這兩個方法的返回值。這兩個方法返回的都是字符串,但是什么時候調用__str__?什么時候調用__repr__?我們看下面的例子
類中只重寫了__str__方法
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' In [1]: class A: ...: def __str__(self): ...: return '__str__' ...: In [2]: a = A() In [3]: a Out[3]: <__main__.A at 0x7ffb3f2ba048>In [4]: print(a) __str__在交互模式下,直接輸入對象再回車,返回的結果與原來一樣;但是打印對象時,觸發了__str__方法。
類中只重寫了__repr__方法
In [1]: class B: ...: def __repr__(self): ...: return '__repr__' ...: In [2]: b = B() In [3]: b Out[3]: __repr__In [4]: print(b) __repr__在交互模式下,直接輸入對象再回車以及打印對象都觸發了__repr__方法。
類中重寫了__str__與__repr__方法
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' In [1]: class C: ...: def __str__(self): ...: return '__str__' ...: def __repr__(self): ...: return '__repr__' ...: In [2]: c = C() In [3]: c Out[3]: __repr__In [4]: print(c) __str__在交互模式下,直接輸入對象再回車,觸發了__repr__方法;打印對象觸發__str__方法。
總結一下,當我們直接查看對象(輸入對象再回車)時,無論怎樣觸發的都是__repr__方法;如果自定義類中沒有重寫這個方法,我們知道Python3中都是新式類,即默認都繼承了object類,那么此時就會調用object中的__repr__方法。當我們打印對象時,大多數情況觸發的都是__str__方法,但當自定義類中只重寫了__repr__方法時,會觸發__repr__方法。
str()和repr()函數
str()默認觸發__str__方法,repr()默認觸發__repr__方法,觸發的機制與上述一樣;另外,列表、字典等容器總是會觸發__repr__方法,代碼示例如下:
# 類中只重寫了__str__方法 In [5]: str(a) Out[5]: '__str__'In [6]: repr(a) Out[6]: '<__main__.A object at 0x7ffb3f2ba048>'# 類中只重寫了__repr__方法 In [5]: str(b) Out[5]: '__repr__'In [6]: repr(b) Out[6]: '__repr__'# 類中重寫了__str__與__repr__方法 In [5]: str(c) Out[5]: '__str__'In [6]: repr(c) Out[6]: '__repr__'# 列表、字典等容器總是會觸發__repr__方法 In [53]: print([a]) [<__main__.A object at 0x7ffb3f2ba048>] In [7]: str([c]) Out[7]: '[__repr__]'In [8]: repr([c]) Out[8]: '[__repr__]'In [9]: [c] Out[9]: [__repr__]In [10]: print([c]) [__repr__]__str__與__repr__的本質區別
那__str__與__repr__的本質區別到底是什么呢? 先看官方描述
- __ str__: Called by str(object) and the built-in functions format() and print() to compute the “informal” or nicely printable string representation of an object.
- __ repr__: Called by the repr() built-in function to compute the “official” string representation of an object. This is typically used for debugging, so it is important that the representation is information-rich and unambiguous.
總結一下,__str__是一個對象的非正式的、易于閱讀的字符串描述,當類str實例化( str(object) )時會被調用,以及會被內置函數format()和print()調用;__repr__是一個對象的官方的字符串描述,會被內置函數repr()方法調用,它的描述必須是信息豐富的和明確的。也就是說__str__返回的結果可讀性強,__repr__返回的結果更加準確。再看一個例子
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' In [1]: import datetime In [2]: d = datetime.datetime.now() In [3]: str(d) Out[3]: '2019-08-24 08:12:17.942242' # 可讀性強In [4]: repr(d) Out[4]: 'datetime.datetime(2019, 8, 24, 8, 12, 17, 942242)' # 信息更加豐富和準確總結
- 在自定義類中,可以通過重寫__str__和__repr__方法來定制類對象到字符串的轉化。
- 一般情況下,推薦至少添加一個 __ repr__ 方法來定制對象到字符串的自定義轉化,__ str__ 是可選的。因為默認情況下,在需要卻找不到 __ str__ 方法的時候,會自動調用 __ repr__ 方法。
- __str__方法的目標在于可讀性,__repr__方法的目標在于準確性。
總結
以上是生活随笔為你收集整理的python中魔法方法__str__与__repr__的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python字符串和正则表达式中的反斜杠
- 下一篇: Python基础教程:对象的方法