《Python 語法淺析:Difference between __str__ and __repr__ in Python》

背景

"Difference between str and repr in Python"(stackoverflow.com/questions/1… 是 Stack Overflow 上的一個問題。python

在此,筆者將從代碼 & 語法兩個層次,進行分析。程序員

代碼淺析

class Test(object): pass
test = Test()
str(test)                   # <__main__.Test object at 0x108ff4f28>
repr(test)                  # <__main__.Test object at 0x108ff4f28>

class Repr(object):
    def __repr__(self): 
        return '__repr__'
r = Repr()
str(r)                      # '__repr__'
repr(r)                     # '__repr__'

class Str(object):
    def __str__(self): 
        return '__str__'
s = Str()                   
str(s)                      # '__str__'
repr(s)                     # '<__main__.Str object at 0x109170898>'
複製代碼

由以上代碼,能夠看出來:若是你覆蓋了 __repr__ 方法,__str__ 也適用,但反之亦然。bash

語法淺析

repr(object)
    返回包含一個對象的可打印表示形式的字符串。
    類能夠經過定義 __repr__() 方法來控制此函數爲它的實例所返回的內容。

object.__repr__(self)
    由 repr() 內置函數調用以輸出一個對象的'官方'字符串表示。
    此方法一般被用於調試。面向程序員


str(object='')
    返回 object 的字符串版本。即返回 object.__str__()。
    若是 object 沒有 __str__ 方法,則返回 repr(object)。

object.__str__(self)
    經過 str(object) 以及內置函數 format() 和 print() 的調用,生成一個對象的字符串表示。
    返回值必須是字符串對象
    內置類型 object 所定義的默認實現會調用 object.__repr__()。
複製代碼

由以上可知:函數

  • __repr__ 適用於開發調試
  • __str__ 適用於用戶(例如:輸出、format()、print())
  • object.__str__ 會調用 object.__repr__

總結

若是你只想實現兩個特殊方法中的一個,__repr__ 是更好的選擇,由於若是一個對象沒有 __str__ 函數,而 Python 又須要調用它的時候,解釋器會用 __repr__ 做爲代替。ui

相關文章
相關標籤/搜索