在 Python 中要將某一類型的變量或者常量轉(zhuǎn)換為字符串對象通常有兩種方法,即 str() 或者 repr() 。
>>> a = 10
>>> type(str(a))
<class 'str'>
>>> type(repr(a))
<class 'str'>
但是這二者之間有什么區(qū)別呢?因為提供兩個功能完全相同的內(nèi)建函數(shù)是沒有意義的。先看一個例子。
>>> print(str('123'))
123
>>> print(str(123))
123
>>> print(repr('123'))
'123'
>>> print(repr(123))
123
從例子中不難發(fā)現(xiàn),當(dāng)我們把一個字符串傳給 str() 函數(shù)再打印到終端的時候,輸出的字符不帶引號。而將一個字符串傳給 repr() 函數(shù)再打印到終端的時候,輸出的字符帶有引號。
造成這兩種輸出形式不同的原因在于:
-
print語句結(jié)合str()函數(shù)實際上是調(diào)用了對象的__str__方法來輸出結(jié)果。而print結(jié)合repr()實際上是調(diào)用對象的__repr__方法輸出結(jié)果。下例中我們用str對象直接調(diào)用這兩個方法,輸出結(jié)果的形式與前一個例子保持一致。
>>> print('123'.__repr__())
'123'
>>> print('123'.__str__())
123
不過這個例子可能還是無法很好表達(dá)到底 str() 與 repr() 各有什么意義,我們再來看一個例子。
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(str(now))
2017-04-22 15:41:33.012917
>>> print(repr(now))
datetime.datetime(2017, 4, 22, 15, 41, 33, 12917)
通過 str() 的輸出結(jié)果我們能很好地知道 now 實例的內(nèi)容,但是卻丟失了 now 實例的數(shù)據(jù)類型信息。而通過 repr() 的輸出結(jié)果我們不僅能獲得 now 實例的內(nèi)容,還能知道 now 是 datetime.datetime 對象的實例。
因此 str() 與 repr() 的不同在于:
-
str()的輸出追求可讀性,輸出格式要便于理解,適合用于輸出內(nèi)容到用戶終端。 -
repr()的輸出追求明確性,除了對象內(nèi)容,還需要展示出對象的數(shù)據(jù)類型信息,適合開發(fā)和調(diào)試階段使用。
另外如果想要自定義類的實例能夠被 str() 和 repr() 所調(diào)用,那么就需要在自定義類中重載 __str__ 和 __repr__ 方法。