python str和repr有什麼區別?

時間 2021-06-01 12:41:37

1樓:宋偉

我們先通過 date 模組裡的 today 類來直觀認識下 __str__() 和 __repr__() 。

>>>from

datetime

import

date

>>>today

=date

.today

()>>>

print

(today

)2021-01

-18>>>today

datetime

.date

(2021,1

,18)在上面的例子中,首先建立乙個 today 物件,然後輸出 today 物件。我們發現,直接輸出 today 物件和呼叫 print 函式列印 today 物件的輸出是不一樣的。直接輸出 today 物件的結果為 datetime.

date(2021, 1, 18) ,呼叫 print 函式列印的輸出為 2021-01-18 。這是因為呼叫 print 函式列印 today 物件隱式呼叫了 str() 方法,而 str() 方法會隱式地呼叫物件的 __str__() 方法。直接輸出物件會隱式的呼叫物件的 __repr__() 方法。

我們也可以直接呼叫 str() 方法和 repr() 方法進行輸出。

>>>from

datetime

import

date

>>>today

=date

.today

()>>>

str(

today

)'2021-01-18'

>>>repr

(today

)'datetime.date(2021, 1, 18)'

輸出的結果和上面是一樣的。

類中不包含 __str__() 和 __repr__()

>>>class

Dog:

...def

__init__

(self

,name

,age

):...

self

.name

=name

...self

.age

=age

......

...>>>

my_dog

=Dog

("willie",3

)>>>

my_dog

<__main__

.Dog

object

at0x7f86e42c4c10

>>>>print

(my_dog

)<__main__

.Dog

object

at0x7f86e42c4c10

>在 Dog 類中,我們沒有定義方法 __str__ 和 __repr__ 。可以看到在沒有定義 __str__ 和 __repr__ 方法的情況下,不管是直接輸出物件還是呼叫 print() 函式進行輸出,輸出結果都是 <__main__.Dog object at 0x7f86e42c4c10>。

在這種情況下使用的是預設的 __str__() 和 __repr__() 。 2. 類中包含 __str__() 下面在類中新增 __str__() 方法。

>>>class

Dog:

...def

__init__

(self

,name

,age

):...

self

.name

=name

...self

.age

=age

......

...def

__str__

(self

):...

return

f"(, )"

......

>>>my_dog

=Dog

("willie",3

)>>>

my_dog

<__main__

.Dog

object

at0x7f86e4a20520

>>>>print

(my_dog

)Dog

(willie,3

)在新增 __str__ 方法之後,對物件直接進行輸出的結果和沒有新增方法 __str__() 是一樣的。但是呼叫 print() 函式進行輸出時,輸出結果變成了 Dog(willie, 3),這是因為在定義了 __str__() 方法之後,呼叫 print() 函式進行輸出時,呼叫了類的 __str__() 方法。 3.

類中包含 __str__() 和 __repr__() 接下來我們繼續新增 __repr__() 方法。

>>>class

Dog:

...def

__init__

(self

,name

,age

):...

self

.name

=name

...self

.age

=age

......

...def

__str__

(self

):...

return

f"(, ),__str__()"

......

...def

__repr__

(self

):...

return

f"(, ),__repr__()"

......

>>>my_dog

=Dog

("willie",3

)>>>

my_dog

Dog(

willie,3

),__repr__

()>>>

print

(my_dog

)Dog

(willie,3

),__str__

()在繼續新增 __repr__() 方法之後,對物件進行直接輸出時,呼叫 __repr__() 方法,輸出結果為 Dog(willie, 3),__repr__()。呼叫 print() 函式對物件進行輸出時,呼叫 __str__() 方法,輸出結果為 Dog(willie, 3),__str__() 。 4.

類中包含 __repr__()

>>>class

Dog:

...def

__init__

(self

,name

,age

):...

self

.name

=name

...self

.age

=age

......

...def

__repr__

(self

):...

return

f"(, )"

......

>>>my_dog

=Dog

("willie",3

)>>>

my_dog

Dog(

willie,3

)>>>

print

(my_dog

)Dog

(willie,3

)在去掉 __str__() 方法之後,不管是直接輸出物件還是呼叫 print() 函式進行輸出,輸出結果都是 Dog(willie, 3)。這表明,當類中只包含 __repr__() 方法時,不管是直接輸出還是呼叫 print() 函式進行輸出,都會呼叫類的 __repr__() 方法。

__str__() 用於為終端使用者建立輸出,而 __repr__() 主要用於除錯和開發。

為任何自定義的類新增 __repr__() 方法。

當自定義類中沒有定義 __str__() 和 __repr__() 時,在進行物件的輸出時,會呼叫預設的 __str__() 和 __repr__() ;當類中只包含 __str__() 時,呼叫 print() 函式進行物件的輸出,會呼叫 __str__(),直接輸出呼叫預設的 __repr__();當類中既包含 __str__() 又包含 __repr__() 時,呼叫 print() 函式進行物件的輸出,會呼叫 __str__(),直接輸出會呼叫 __repr__();當類中只包含 __repr__() 時,呼叫 print() 函式進行物件的輸出和直接輸出都會呼叫 __repr__()。

2樓:匿蟒

str是給人看的,而repr是給程式看的。

乙個合理實現了repr的物件,eval是其逆運算。

>>>eval

(repr

(obj

))==

objTrue

對於不可變類(Immutable class),這一點很容易實現。但對於可變類(Mutable class),這需要乙個非常複雜的__init__ 初始化函式,所以也不強求。

3樓:亡靈之貓

本質上就是對應類的不同方法:

str 對應類的 __str__(self)repr 對應類的 __repr__(self)這只是一種約定,並不是某種技術或者概念:

repr 一般用於進行 report,即對當前例項進行乙個演示文稿,內容應當是對型別和例項結構的反射資訊

str 一般用於執行 tostring, 即強制轉換為字串,是型別轉換主要手段

對乙個例項進行print或者使用%s進行格式化時,Python缺省會使用str對例項執行強制轉換

而命令列中空敲例項名則預設使用repr輸出例項資訊

和 有哪些區別?

周道仁 可以看看我剛出爐的如何掌握和區分周道仁的文章 知乎 https zhuanlan p 14 1183436 教日語的小慌先生 直接上結論 空間概念 飛了過來 vs 飛了過去 原義 根本用法 時間概念 發展而來 vs 發展下去 引申義 程度概念 熱了起來 vs 冷卻下去 引申義 遠處 飛 來 ...

replicate 和 duplicate 有什麼不同

eric 這種看英文解析很好理解 基本是完全不一樣的意思 duplicate verb make exact copy of something adjective made as exact copy of something noun exact copy of something replic...

DD WRT, Tomato 和 OpenWRT 有什麼區別和聯絡?哪乙個更好?

佐須之男 目前我已經將Tomato移植到openwrt上去了,具體可以看特大新聞 Tomato Phoenix 不死鳥系統成功移植到OpenWRT。 Li Joe 只用openwrt較多。就openwrt系統而言,其本質就是乙個linux作業系統。你的路由器就是乙個小型電腦,帶有儲存flash.刷機...