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.mzph.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; 该用家电…