python中魔法方法__str__与__repr__的区别
提出問題
當(dāng)我們自定義一個類時,打印這個類對象或者在交互模式下直接輸入這個類對象按回車,默認(rèn)顯示出來的信息好像用處不大。如下所示
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>可以發(fā)現(xiàn),兩種方式顯示出來的信息都是對象所屬類的名稱以及對象所在的地址,而很多時候這不是我們想要的信息,此時我們可以通過重寫__str__和__repr__方法來定制我們想要的信息。
__str__與__repr__簡單介紹
__ str__ 和 __ repr__ 方法,是自定義類的字符串描述,當(dāng)我們打印或查看某個對象時,最終看到的結(jié)果是這兩個方法的返回值。這兩個方法返回的都是字符串,但是什么時候調(diào)用__str__?什么時候調(diào)用__repr__?我們看下面的例子
類中只重寫了__str__方法
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和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__在交互模式下,直接輸入對象再回車,返回的結(jié)果與原來一樣;但是打印對象時,觸發(fā)了__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__在交互模式下,直接輸入對象再回車以及打印對象都觸發(fā)了__repr__方法。
類中重寫了__str__與__repr__方法
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和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__在交互模式下,直接輸入對象再回車,觸發(fā)了__repr__方法;打印對象觸發(fā)__str__方法。
總結(jié)一下,當(dāng)我們直接查看對象(輸入對象再回車)時,無論怎樣觸發(fā)的都是__repr__方法;如果自定義類中沒有重寫這個方法,我們知道Python3中都是新式類,即默認(rèn)都繼承了object類,那么此時就會調(diào)用object中的__repr__方法。當(dāng)我們打印對象時,大多數(shù)情況觸發(fā)的都是__str__方法,但當(dāng)自定義類中只重寫了__repr__方法時,會觸發(fā)__repr__方法。
str()和repr()函數(shù)
str()默認(rèn)觸發(fā)__str__方法,repr()默認(rèn)觸發(fā)__repr__方法,觸發(fā)的機(jī)制與上述一樣;另外,列表、字典等容器總是會觸發(fā)__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__'# 列表、字典等容器總是會觸發(fā)__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__的本質(zhì)區(qū)別
那__str__與__repr__的本質(zhì)區(qū)別到底是什么呢? 先看官方描述
- __ 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.
總結(jié)一下,__str__是一個對象的非正式的、易于閱讀的字符串描述,當(dāng)類str實例化( str(object) )時會被調(diào)用,以及會被內(nèi)置函數(shù)format()和print()調(diào)用;__repr__是一個對象的官方的字符串描述,會被內(nèi)置函數(shù)repr()方法調(diào)用,它的描述必須是信息豐富的和明確的。也就是說__str__返回的結(jié)果可讀性強(qiáng),__repr__返回的結(jié)果更加準(zhǔn)確。再看一個例子
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' In [1]: import datetime In [2]: d = datetime.datetime.now() In [3]: str(d) Out[3]: '2019-08-24 08:12:17.942242' # 可讀性強(qiáng)In [4]: repr(d) Out[4]: 'datetime.datetime(2019, 8, 24, 8, 12, 17, 942242)' # 信息更加豐富和準(zhǔn)確總結(jié)
- 在自定義類中,可以通過重寫__str__和__repr__方法來定制類對象到字符串的轉(zhuǎn)化。
- 一般情況下,推薦至少添加一個 __ repr__ 方法來定制對象到字符串的自定義轉(zhuǎn)化,__ str__ 是可選的。因為默認(rèn)情況下,在需要卻找不到 __ str__ 方法的時候,會自動調(diào)用 __ repr__ 方法。
- __str__方法的目標(biāo)在于可讀性,__repr__方法的目標(biāo)在于準(zhǔn)確性。
總結(jié)
以上是生活随笔為你收集整理的python中魔法方法__str__与__repr__的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python字符串和正则表达式中的反斜杠
- 下一篇: Python基础教程:对象的方法