1樓:宋偉
我們先通過 date 模組裡的 today 類來直觀認識下 __str__() 和 __repr__() 。
>>>from
datetime
import
date
>>>today
=date
.today
()>>>
(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
(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
(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__
()>>>
(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
)>>>
(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.刷機...