在 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
不過這個例子可能還是無法很好表達到底 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__
方法尾组。