一文徹底搞懂Python中__str__和__repr__
__str__和__repr__有什么異同?
字符串的表示形式
我們都知道,Python的內(nèi)置函數(shù) repr()? 能夠把對象用字符串的形式表達(dá)出來,方便我們辨認(rèn)。這就是“字符串表示形式”。repr()? 就是通過 __repr__? 這個特殊方法來得到一個對象的字符串表示形式的。如果沒有實現(xiàn) __repr__ ,當(dāng)我們在控制臺里打印一個向量的實例時,得到的字符串可能會是 <Vector object at 0x10a514f98>。
**__str__**?vs.**__repr__**
接下來我們看一看**__str__**和**__repr__**?有哪些異同。根據(jù)Python官方文檔定義:
- __str__?:通過 str(object) 以及內(nèi)置函數(shù) format() 和 print() 調(diào)用以生成一個對象的“非正式”或格式良好的字符串表示。返回值必須是字符串對象。
- __repr__?:是由 repr() 內(nèi)置函數(shù)調(diào)用,用來輸出一個對象的“官方”字符串表示。返回值必須是字符串對象,此方法通常被用于調(diào)試。內(nèi)置類型 object 所定義的默認(rèn)實現(xiàn)會調(diào)用 object.__repr__()。
什么正式與非正式格式,你已經(jīng)搞懵了是嗎?沒事,我們接著看:
1. 兩者都能輸出對象
當(dāng) x=4,當(dāng) x 為整數(shù)類型時,調(diào)用 str()? 和 repr() 的返回結(jié)果是一樣,
而當(dāng)y為字符串類型時,repr(y)? 的結(jié)果就是“正式”的字符串表示,而 str(y)? 的結(jié)果則是“非正式”的。str() 能夠讓我們最快速了解到對象的內(nèi)容,可讀性較高。
2 .__str__?是可讀的,__repr__的目標(biāo)是明確的
可以看出 repr() 更能顯示出對象的類型、值等信息,對象描述清晰的。
在 str()? 函數(shù)被使用,或是在用 print 函數(shù)打印一個對象的時候才被調(diào)用的,并且它返回的字符串對終端用戶更友好。
3. 重寫__repr__?,那也會使用__str_
輸出結(jié)果:
總結(jié)
共同點: 都是用來輸出一個對象
區(qū)別:
- __str__? 的目標(biāo)是可讀的,__str__() 并不預(yù)期返回一個有效的 Python 表達(dá)式,但可以使用更方便或更準(zhǔn)確的描述信息。
- __repr__ 的目標(biāo)是明確的,所返回的字符串應(yīng)該準(zhǔn)確、無歧義,并且盡可能表達(dá)出如何用代碼創(chuàng)建出這個被打印的對象。
- 容器的__str__? 方法的使用包含對象的 __repr__?