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