1. 程式人生 > 程式設計 >Python中__repr__和__str__區別詳解

Python中__repr__和__str__區別詳解

看下面的例子就明白了

class Test(object):
  def __init__(self,value='hello,world!'):
    self.data = value

>>> t = Test()
>>> t
<__main__.Test at 0x7fa91c307190>
>>> print t
<__main__.Test object at 0x7fa91c307190>

看到了麼?上面列印類物件並不是很友好,顯示的是物件的記憶體地址

下面我們重構下該類的__ repr__以及str,看看它們倆有啥區別

# 重構__repr__
class TestRepr(Test):
  def __repr__(self):
    return 'TestRepr(%s)' % self.data

>>> tr = TestRepr()
>>> tr        直接終端顯示,不print就是面向程式設計師
TestRepr(hello,world!)
>>> print tr     print是面向程式設計師
TestRepr(hello,world!)

重構__ repr__方法後,不管直接輸出物件還是通過print列印的資訊都按我們repr方法中定義的格式進行顯示了

# 重構__str__
calss TestStr(Test):
  def __str__(self):
    return '[Value: %s]' % self.data

>>> ts = TestStr()
>>> ts
<__main__.TestStr at 0x7fa91c314e50>
>>> print ts
[Value: hello,world!]

你會發現,直接輸出物件ts時並沒有按我們str方法中定義的格式進行輸出,而用print輸出的資訊卻改變了

repr和str這兩個方法都是用於顯示的,str是面向使用者的,而repr面向程式設計師。

列印操作會首先嚐試str和str內建函式(print執行的內部等價形式),它通常應該返回一個友好的顯示。

__ repr__用於所有其他的環境中:用於互動模式下提示迴應以及repr函式,如果沒有使用str,會使用print和str。它通常應該返回一個編碼字串,可以用來重新建立物件,或者給開發者詳細的顯示。

當我們想所有環境下都統一顯示的話,可以重構repr方法;當我們想在不同環境下支援不同的顯示,例如終端使用者顯示使用str,而程式設計師在開發期間則使用底層的repr來顯示,實際上str只是覆蓋了repr以得到更友好的使用者顯示。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。