1. 程式人生 > >python中兩個魔術方法 __repr__和__str__

python中兩個魔術方法 __repr__和__str__

repr() 和 str() 的區別

  • str()
    1 使用str()函式時, 才呼叫__str_ __
    2 使用print()函式時
    3 str() 的輸出追求可讀性,輸出格式要便於理解,適合用於輸出內容到使用者終端。
  • repr()
    1 使用repr()時,才呼叫___repr_ __
    2 在互動式控制檯(即:>>)或除錯程式(即Debug執行程式碼時)
    3 repr() 的輸出追求明確性,除了物件內容,還需要展示出物件的資料型別資訊,適合開發和除錯階段使用
class A(object):pass
a = A()
>>> a
<
__main__.A object at 0x000002E26B4D89E8> >>> str(a) '<__main__.A object at 0x000002E26B4D89E8>' >>> repr(a) '<__main__.A object at 0x000002E26B4D89E8>' >>> print(a) <__main__.A object at 0x000002E26B4D89E8> >>> print(str(a)) <__main__.A object at 0x000002E26B4D89E8> >>
> print(repr(a)) <__main__.A object at 0x000002E26B4D89E8>

上面顯示的內容是由於類的特殊方法(沒有自定義str和repr時), 在print()和直接執行例項a的時候回列印字串。就會出現上面的結果。

 class A(object):
     def __repr__(self):
             return '這是__repr__'
     def __str__(self):
             return '這是__str__'
>>> a                  
這是__repr__
>>
> repr(a) '這是__repr__' >>> str(a) '這是__str__' >>> print(a) 這是__str__
class A(object):
	def __str__(self):
	return '這是__str__'
a = A()
>>> a
<__main__.A object at 0x000002E26B4D89B0>
>>> repr(a)
'<__main__.A object at 0x000002E26B4D89B0>'
>>> str(a)
'這是__str__'
>>> print(a)
這是__str__
class A(object):
	def __repr__(self):
		return '這是__repr'
>>> a
這是__repr__
>>> repr(a)
'這是__repr__'
>>> str(a)
'這是__repr__'
>>> print(a)
這是__repr__
總結:如果一個物件沒有__str__函式,python又需要呼叫它時,直譯器就會__repr__作為代替,

repr(object)官方文件
repr(object) 返回包含物件的可打印表示形式的字串

1 嘗試生成這樣一個字串,其結果絕大多數情況下(不是所有)可以通過內建函式eval(重新得到該物件,即obj==eval(repr(obj))這個等式是成立的。
2 否則,生成用尖括號包住的字串,包含型別名和額外的資訊(比如地址)
3 類可以通過定義__repr__()方法來控制這個函式返回給它的例項的內容。

str() 返回包含物件的可打印表示形式的字串
1 嘗試生成這樣一個字串,結果不可以通過eval()可重新生成同樣的物件

a = 'hello'
>>a
'hello'
>>print(a)
hello
>>str(a)           #字串本身還是字串
'hello'
>>print(str(a))
hello
>>repr(a)
"'hello'"
>>print(repr(a))
'hello'

https://blog.csdn.net/sinat_41104353/article/details/79254149
https://blog.csdn.net/WIinter_FDd/article/details/78063985