python中與0xf2相等的是_python中__str__與__repr__

(1)背景

python中,對于類(自定義類)的實例對象的默認顯示既沒有太大用處,也不美觀。比如:

1 classadder:2 def __init__(self,value=0):3 self.data=value #初始化數據

4 def __add__(self,other):5 self.data+=other6>>> x=adder()7>>>print(x)

<__main__.adder. object at>8>>>x

而通過__str__或者__repr__,可以定制化(costomise)顯示,比如,下面代碼中,在子類中定義了一個返回實例字符的__repr__方法。注意,在python3中所有對象都繼承了object的__str__,也就是實例對象的默認顯示。

1 >>>classaddrepr(adder):2 def __repr__(self):3 return 'addrepr(%s)'%self.data4 >>>x=addrepr(2) #運行__init__

5 >>>x+1 #運行__add__

6 >>>x #運行__repr__

7 addrepr(3)8 >>>print(x) #運行__repr__

9 addrepr(3)10 >>>str(x),repr(x) #均運行__repr__

11 ('addrepr(3)','addrepr(3)')

View Code

當類實例化對象被打印或者轉化為字符時,如果定義了__repr__(或者__str__),那么該__repr__(或者__str__)將被自動調用,這里__repr__用了最基本的字符格式來將self.data轉化為友好的字符顯示。

(2)為什么要用兩種顯示方法

雖然__str__與__rer__的作用都是為了獲得更友好的字符顯示,但對于代碼的設計有一些細微的區別。

(a)對于print和str內建函數,程序會首先嘗試__str__函數,如果沒有__str__函數,則嘗試__repr__函數,如果沒有__repr__函數,則選用默認顯示;

(b)在其他情況下,比如交互式回應(interactive echoes),repr函數,和嵌套中,__repr__被調用,一般地,它應該為開發者返回較為詳細的顯示。

下面通過代碼說明兩種方法的不同:

1 >>>classaddstr(adder):2 def __str__(self):3 return '[value:%s]'%self.data4 >>>x=addstr(3)5 >>>x #默認顯示6 <__main__.addstr object at>

7 >>>print(x) #調用__str__8 [value:4]9 >>>str(x),repr(x)10 ('[value:4]','<__main__.addstr object at>

(c)如果同時定義了兩種方法,那么可以在不同情況下,支持不同的顯示。如下面代碼:

1 >>>classaddboth(adder):2 def __str__(self):3 return '[value:%s]'%self.data4 def __repr__(self):5 return 'addboth(%s)'%self.dat6 >>>x=addboth(4)7 >>>x+1

8 >>>x #調用__repr__

9 addboth(5)10 >>>print(x) #調用__str__

11 [value:5]12 >>>str(x),repr(x) #分別調用__str_,__repr__

13 ('[value:5]','addboth(5)')

總結下來以上幾點就是:只有在print(),str()時,才會調用__str__()(如果沒有__str__則調用__repr__),其他情況均調用__repr__,如交互式情況下單獨顯示,repr()等。

(3)使用的三點注意

(a)首先是__str__和__repr__必須均返回字符,返回其他類型,將會報錯,所以必要的話必須確保它們進行字符轉換(比如str,%s)。

(b)根據容器(container)的字符轉換,僅有當對象出現在print的頂層時,才會調用__str__;嵌套在大的對象里的對象顯示,將仍調用__repr__,下面代碼說明了這一點:

1 >>>classPrinter:2 def __init__(self,value):3 self.value=value4 def __str__(self):5 returnstr(self.value)6 >>>objs=[Printer(2),Printer(3)]7 >>>for x in objs:print(x)8

9 2

10 3

11 >>>print(objs)12 [<__main__.printer object at>]13 >>>objs14 [<__main__.printer object at>,<__main__.printer object at>]

為確保不論有無容器,在所有情況下顯示設定的顯示模式,用__repr__,不用__str__,用如下代碼進行說明:

1 >>> classPrinter:2 def __init__(self,value):3 self.val=value4 def __repr__(self): #如果沒有__str__,調用__repr__

5 return '%s'%self.val6

7

8 >>> objs=[Printer(2),Printer(3)]9 >>> for x in objs:print(x)10

11 2

12 3

13 >>> print(objs) #調用__repr__

14 [2, 3]15 >>>objs16 [2, 3]

(c)第三,也是最為微妙的,顯示方法在極少情況下有時又也有可能觸發無限迭代循環(infinite recursion loops),因為一些對象的顯示包括了其他對象的的顯示,而一個顯示觸發了正在被顯示的對象的顯示,因而進入無限循環中。如下代碼:

"""this scripts is intended to illustrate the infinite recursion loops

caused by __repr__ overloading methods. displaying the value of a method,line10 in this script, can trigger the __repr__

of the class method, then the __repr__ method is called again, and the infinite recursion loops happen."""

classBase:def __init__(self):

self.data=1

defprint0(self):pass

defprint1(self):

a=str(getattr(self,'print0')) #Caution! getattr(object,attrname),attrname shall be string.

returnaclassNormal(Base):def __str__(self):return '%s'%self.print1()classRecursion(Base):def __repr__(self):return '%s'%self.print1()if __name__=='__main__':

a=Normal()

b=Recursion()print(a)try:print(b)exceptRecursionError:print('A recusion error happens')

運行結果為:

>A recusion error happens

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle清理asm歸檔日志,【Oracle】 rman 刪除歸檔日志的命令

因為數據倉庫上asm的磁盤空間不足&#xff0c;需要刪除早期的歸檔日志&#xff0c;查看資料有以下兩種方式&#xff1a;delete archivelog until time sysdate-N;delete archivelog all completed before sysdate-N;這兩個命令的差別在哪里呢&#xff1f;使用list 命令來查看一…

求逆矩陣計算器_991CN的矩陣運算

昨天的推文中說了一道二端口的題目&#xff0c;虛線中的大二端口由兩個小二端口級聯而成&#xff0c;在計算過程中&#xff0c;我們需要使用到矩陣的運算&#xff0c;昨天講題的時候說會說一下用計算器進行矩陣運算&#xff0c;今天我們就來說一下。其實在算電路的時候&#xf…

去快捷方式小箭頭_電腦桌面如何快速去掉快捷方式小箭頭

我們使用電腦時會發現在電腦桌面圖標上經常有一個小箭頭&#xff0c;這是什么原因呢&#xff1f;原來&#xff0c;這個小箭頭只存在于快捷方式的軟件圖標上&#xff0c;就是說通過快捷方式創建的圖標就有這個小箭頭。那么如何去掉這些小箭頭呢&#xff01;不知道也沒關系&#…

Oracle里silent,靜默方式(silent)安裝Oracle軟件

有的時候不方便登陸Linux/Unix的圖形界面安裝數據庫&#xff0c;且GUI方式安裝讓我們無法知道具體是做了什么操作&#xff0c;我們完全可以采用命令模式安裝和刪除Oracle軟件(代替OUI)、建立和刪除數據庫庫(代替dbca)。平臺&#xff1a;RHEL4.5&#xff0c;Oracle10.2.0.11、上…

oracle 移動日志文件,Oracle數據庫移動數據文件、日志文件和控制文件

1、關閉數據庫SQL> shutdown immediate;2、移動數據文件和日志文件到新位置SQL> host mv /u01/olddata.dbf /u02/newdata.dbf;SQL> host mv /u01/oldredo.log /u02/newredo.log;3、以加載模式啟動數據庫SQL> startup mount;4、在數據庫中更改數據文件和日志文件路徑…

python3導入_Python3導入相對還是絕對的正確方法?

我正在編寫一個python模塊。在Python2中一切正常&#xff0c;但在Python3中&#xff0c;導入失敗。這是我的代碼結構。neuralnet/__init__.pytrain.py # A wrapper to train (does not define new things)neuralnet.py # Defines the workhorse class neuralnetlayers/__init__…

oracle pdb是什么意思,淺談Oracle數據庫12c PDB技術

PDB大致功能描述&#xff1a;創建&#xff1a;用create pluggable database的命令&#xff0c;用file_name_convert的方式拷貝seed pdb的文件到對應的新pdb的路徑下。拷貝的是最基本system和sysaux表空間&#xff0c;將新建的pdb從mount的狀態打開到read write的狀態。建立pdb用…

oracle查詢sql時間ain,Oracle SQL 時間查詢

一、在使用Oracle的to_date函數來做日期轉換時&#xff0c;很多Java程序員也許會和我一樣&#xff0c;直覺的采用ldquo;yyyy-MM-dd HH:mm:ssrdquo;的to_date()與24小時制表示法及mm分鐘的顯示&#xff1a;一、在使用Oracle的to_date函數來做日期轉換時&#xff0c;很多Java程序…

室內定位算法_001:室內定位算法技術咨詢服務工作室簡介(更新)

點擊藍字關注我們團隊成員&#xff1a;何博士(中國科學院大學&#xff0c;博士) 楊博士(加拿大多倫多大學&#xff0c;博士后)微信聯系號&#xff1a;UWB_cwhe服務模式&#xff1a;1. 為企業提供定位算法技術支持與指導&#xff0c;以提高企業室內定位系統產品的穩定…

雙系統還是虛擬機 linux系統時間,你會選擇Mac虛擬機還是雙系統

在Mac上運行雙系統&#xff0c;你是會選擇Mac虛擬機呢還是直接雙系統&#xff1f;今天我們就這個問題來討論一下這兩之前的區別&#xff0c;究竟是選擇Mac最好用的虛擬機 parallels desktop還是Boot Camp&#xff1f;1、安裝在pd虛擬機中&#xff0c;安裝系統和安裝驅動完全自動…

oracle中修改多個字段默認值_利用VBA代碼在已有的數據表中刪除、添加、修改字段...

大家好,今日繼續給大家講解VBA數據庫解決方案的第21講,如何利用VBA代碼在已有的數據表中刪除&#xff0c;添加&#xff0c;修改字段。這個內容是操作數據庫的一項必修的內容&#xff0c;還望大家在實際工作中多利用&#xff0c;所以這節的知識&#xff0c;對于讀者提高自己的數…

cs1.5 linux服務端,CS1.5在linux上的配置

CS1.5在linux上的配置作者&#xff1a;作者第一步下載所需要的軟件&#xff1a;hlds_l_3110_full.tar.gzhlds_l_3110b_beta.tar.gzcs_15_full.tar.gzmetamod-1.13.tgzcm_cstrike_1_80_19-en_beta.zipsm_cstrike-2.6.15.zip第二步 解壓 hlds_l_3110_full.tar.gzhlds_l_3110b_bet…

java跟python優勢_當前Java與Python相比還有哪些優勢

首先&#xff0c;Java語言與Python語言都是非常流行的全場景編程語言&#xff0c;在很多開發場景下&#xff0c;既可以使用Java語言&#xff0c;也可以采用Python語言&#xff0c;比如Web開發、大數據開發等等。隨著近幾年大數據和人工智能領域的熱度越來越高&#xff0c;Pytho…

linux添加刪除回環地址,CentOS7如何添加本地回環地址?CentOS7添加本地回環地址的方法...

1、臨時添加ip addr add 10.10.1.1/32 dev lo:1重啟失效2、永久添加cd /etc/sysconfig/network-scriptscp ifcfg-lo ifcfg-lo:1[rootlocalhost network-scripts]# cat ifcfg-lo:1DEVICElo:1IPADDR10.10.1.1NETMASK255.255.255.255ONBOOTyesNAMEloopback1[rootlocalhost network…

python判斷語句的復雜度_Python內置方法的時間復雜度(轉)

本文翻譯自Python Wiki本文基于GPL v2協議&#xff0c;轉載請保留此協議。本頁面涵蓋了Python中若干方法的時間復雜度(或者叫“大歐”&#xff0c;“Big O”)。該時間復雜度的計算基于當前(譯注&#xff1a;至少是2011年之前)的CPython實現。其他Python的實現(包括老版本或者尚…

linux中的碼字軟件,碼字寫作軟件下載

極音創作linux版一款的掌上碼字軟件&#xff0c;這款軟件支持ios&#xff0c;mac&#xff0c;Windows和Android設備上自動同步文件&#xff0c;有需要的朋友快來下載吧&#xff01;軟件特色1、【文件功能】在本軟件的左側是導航欄&#xff0c;羅列了幾個常用的功能。在導航條上…

linux svn可視化工具,CentOS6.5安裝SVN 可視化管理工具iF.SVNAdmin

實際系統環境&#xff1a;CentOS 6.5 x64一、安裝Apache通常系統都已經裝好了&#xff0c;但我的服務器上卻沒有安裝&#xff0c;所以要安裝&#xff1a;# yum install httpd二、安裝SVN根據SVN官網指南使用yum進行安裝&#xff1a;# yum install subversion mod_dav_svn三、配…

skywalking使用方法_SkyWalking 源碼分析—— Collector Server Component 服務器組件

摘要: 原創出處 http://www.iocoder.cn/SkyWalking/collector-server-component/「芋道源碼」歡迎轉載&#xff0c;保留摘要&#xff0c;謝謝&#xff01;本文主要基于 SkyWalking 3.2.6 正式版1. 概述2. 接口2.1 Server2.2 ServerHandler3. gRPC 實現3.1 GRPCServer3.2 GRPCHa…

linux dns及時添加,在ARM Linux上成功實現添加DNS庫

工作需要要在嵌入Linux上實現DNS&#xff0c; 從Delphi的Indy9中移植了一個DNS&#xff0c;用了半年了還可以。今日偶然看到了網上有源碼(竟然原來沒有搜到ftp://ftp.isc.org/isc/bind9/9.5.0/bind-9.5.0.tar.gz)1. 找到bind-9.5.0.tar.gz源碼&#xff0c;其中有包含DNS協議的源…

掃地機器人返充原理_掃地機器人全解析

文章引用自 薛先生 &#xff0c;版權完全歸屬薛先生。其公眾號:Alphatree and Evelyn2018-12-12思考出發點&#xff1a;那個多數人印象中亂碰亂撞、還拖著臟污滿屋跑的添亂掃地機&#xff0c;還需要多久才能變聰明&#xff1f;掃地機器人的本質到底是什么&#xff1f; 該用家電…