色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Python 的 __str__ 和 __repr__ 方法對比

瀏覽:7日期:2022-07-12 14:42:18

閱讀到 Strings 中關(guān)于轉(zhuǎn)換對象為字符串的內(nèi)容,介紹了 repr 函數(shù),趁著還沒有真正了解 Python 面向?qū)ο蟮纳枧c熱度,感性上理解一下 repr 與 str 這兩個(gè)函數(shù)的區(qū)別。

Python 的全局方法 repr 和 str 會映射到對象的 __repr__ 和 __str__ 的方法調(diào)用,還有 str(obj) 時(shí)會調(diào)用哪個(gè)方法,以及 print(obj) 和調(diào)試 Python 代碼時(shí)的對象顯示會調(diào)用哪個(gè)方法呢?這就是本文想要印證的內(nèi)容。

恰如 Java 的 System.out.println(obj) 或 'hello' + obj 都會調(diào)用 Java 對象的 toString() 方法,那么 Python 中是怎么一回事呢?

來自某本 Python 入門書的解釋 repr 和 str:

repr: formal string representation of a Python object str: informal string representation of a Python object,或者說 printable string representation

首先 repr 是 representation 的意思,一個(gè)是正式,另一個(gè)是非正式,看起來 repr 比 str 顯得重要些。

對于內(nèi)置的 Python 對象我們可以用 repr, print, 和 str 函數(shù),如針對 list 類型

>>> repr([1,2])’[1, 2]’>>> print([1,2])[1, 2]>>> str([1,2])’[1, 2]’

但是具體上面三個(gè)函數(shù)中分別調(diào)用了 list 的什么方法就不可而知了,這時(shí)候定義一個(gè)自己的類最能說明問題。測試環(huán)境為 IntelliJ, 以調(diào)試截圖來說明分別為 __str__ 和 __repr__ 幾種組合情況

只定義了 __str__ 方法

Python 的 __str__ 和 __repr__ 方法對比

說明:在只定義了 __str__ 方法的情況下

調(diào)試時(shí) IntelliJ 在行內(nèi)顯示對象為 __str__ 的輸出,但變量窗口中顯示的是默認(rèn)的 __repr__ 的輸出 repr 始終堅(jiān)持調(diào)用默認(rèn)的 __repr__ 方法 str 轉(zhuǎn)型函數(shù)調(diào)用了 __str__ 方法 print 調(diào)用了 __str__ 方法

只定義了 __repr__ 方法

Python 的 __str__ 和 __repr__ 方法對比

說明:在只定義了 __repr__ 方法的情況下,可以看出 __repr__ 方法極其強(qiáng)勢,它壟斷了一切的調(diào)用,repr, str, 和 print 函數(shù),甚至是 IntelliJ 的調(diào)試顯示都必須以 __repr__ 方法為核心。

以上所有的情況都是調(diào)用 __repr__ 方法,沒得選擇

同時(shí)定義了 __repr__ 和 __str__ 方法

Python 的 __str__ 和 __repr__ 方法對比

說明:在同時(shí)定義了 __repr__ 和 __str__ 方法的情況下,__str__ 方法反而能扳回來。除了明確的 repr 會調(diào)用 __repr__ 方法,和調(diào)試時(shí)變量窗口中顯示對象會調(diào)用 __repr__ 方法外,其他時(shí)候都是 __str__ 占優(yōu)。具體為

repr 和 IntelliJ 調(diào)試時(shí)變量窗口顯示變量調(diào)用 __repr__ 方法 IntelliJ 調(diào)試時(shí)行內(nèi)顯示變量調(diào)用了 __str__ 方法 str 轉(zhuǎn)型操作調(diào)用了對象的 __str__ 方法,這不能解釋為 informal 非正式的 print 調(diào)用了 __str__ 來獲得對象輸出字符串

另外,格式化字符串時(shí)的調(diào)用的對象方法與 print 時(shí)是一樣的,例如下面的格式化代碼

f1 = '%s' % tf2 = '{}'.format(t)

Python 不知道像 Java 那樣由字符串加上一個(gè)對象

'this is ' + t #Java 中會展開為 'this is ' + t.toString()

Python 會報(bào)以下錯(cuò)誤

TypeError: can only concatenate str (not 'Test') to str

說這里的 + 號只能連接兩個(gè)字符串,除非定義了 __add__ 和 __radd__ 方法,對應(yīng)關(guān)系分別為

t = Test()z1 = ’hello’ + t #相當(dāng)于 t.__radd__(’hello’)z2 = t + ’hello’ #相當(dāng)于 t.__add__(’hello’)

Python 的 __xyz__ 也挺魔幻的。

以上就是Python 的 __str__ 和 __repr__ 方法對比的詳細(xì)內(nèi)容,更多關(guān)于Python __str__ 和 __repr__ 的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 点击进入不卡毛片免费观看 | 欧美成人免费xxx大片 | 一级特级毛片 | 香蕉网影院在线观看免费 | 国产成人免费高清视频 | 亚洲视频免费在线 | 久草在线色站 | 亚洲三级在线看 | 国产一区二区三区在线观看精品 | 麻豆视频一区 | 韩国美女豪爽一级毛片 | jiz欧美高清 | 久久免费视频精品 | 97操碰| 香蕉一区二区三区观 | 中国美女乱淫免费看视频 | 在线播放一区二区精品产 | 久草久草久草 | 国产欧美久久精品 | 97精品国产91久久久久久久 | 国产a国产 | 日韩欧美精品综合一区二区三区 | 一级a欧美毛片 | 日韩黄色片在线观看 | 国产成人久久精品二区三区 | 国产手机在线视频 | 国内精品一区二区2021在线 | 国产视频a区 | 国产精品一级毛片不收费 | 亚洲图片 自拍偷拍 | 国产一国产a一级毛片 | 中文字幕亚洲精品 | 国产亚洲一区呦系列 | 草草影院地址 | 国产区精品 | 久久免费视频8 | 亚洲国产欧美一区二区欧美 | 国产在线观看免费视频软件 | 亚洲线精品一区二区三区 | 91精选视频在线观看 | 草草影院ccyycom |