第8.15节 Python重写自定义类的__repr__方法
一、 引言
前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中,应该重写相关方法,特别是__str__输出的应该是用户关注的容易理解的信息,因此对那些负责与客户交互的类,至少更应该重写__str__方法。
二、 重写__repr__方法
object类提供的__repr__方法,只是简单输出模块名、类名以及对象的ID信息,如果开发者要输出开发人员足够知悉的属性,就需要重写该方法。
重写__repr__方法注意:
- __repr__方法是实例方法,因此带一个参数self,也只能带这个参数;
- 输出的信息尽可能满足开发者的要求,信息必须详尽和准确;
- 可以调用父类的__repr__方法,也可以不调用,需要看开发时输出信息的安排,老猿建议最好调用,这样不用子类开发者去考虑父类的信息怎么输出。
三、 例子 - 例子说明
本节利用Car类来说明__repr__方法,在类中重写了__repr__方法,返回的信息包括:
- 证明调用了重写方法的“In repr:”提示;
- 调用repr(self.class),id(self)获取的对象的类名和ID基础信息;
- 使用__dict__特殊属性输出类的自定义属性及值的字典数据。
- 案例代码
1> 类定义
class Car():
def __init__(self,brand,type,color,weight,oilcostper100km):
self.brand = brand
self.type = type
self.oilcostper100km = oilcostper100km
self.color = color
self.weight = weight
def __repr__(self):
s="In __repr__:\n <{} object at {:#016x}>\n".format(repr(self.__class__),id(self) )#使用类相关的信息输出类名和实例ID
s+=super().__repr__() #直接调用object.__repr__方法输出类信息和实例ID
#通过实例的self.__dict__获取实例的详细属性信息,注意使用了repr函数去获取字典信息字符串
s+='\n'+repr(self.__dict__)
return s
2> 实例定义及查看信息()
car = Car('雪佛兰','科帕奇','白色',1.8,10)
car #查看实例信息,此时会调用__repr__方法
print(car) #查看实例信息,此时会调用__str__方法,但没有重写__str__方法,效果会怎样?
- 案例截图
- 案例总结
通过《第8.13节 Python类中内置方法的__repr__详解》知道,没有重写__repr__方法时,调用的是object类的__repr__方法,仅输出简单的类信息和ID信息。通过上述案例说明:
1> 重写__repr__方法后,查看对象会触发重写方法的调用,其他触发方式请见《第8.13节 Python类中内置方法__repr__详解》,在例子中没有再展开介绍;
2>object类__repr__方法输出结果与repr(self.class),id(self)获取的基础信息相同,而直接调用object类__repr__方法更简单,因此老猿建议对基础信息的输出还是直接调用父类的方法输出;
3> 使用print(car)应该输出__str__方法返回的内容,但实际输出的是重写__repr__方法输出的内容。这是因为自定义类没有重写__str__方法的情况下,Python会直接调用__ repr __方法输出,要输出单独的__str__信息需要重写__str__方法,这个在下节将进行验证。
本节结合案例介绍了 __repr__方法的重写,可以看到通过重写该方法如果输出数据得当,相关信息有利于程序调试和跟踪。
老猿Python系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第8.15节 Python重写自定义类的__repr__方法的更多相关文章
- 第8.16节 Python重写自定义类的__str__方法
一. 引言 上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息.而__str__方法是为最终用户返回类的相关 ...
- Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?
这是因为Python3中,str的输出是调用类的实例方法__str__来输出,如果__str__方法没有重写,则自动继承object类的__str__方法,而object类的__str__方法是调用_ ...
- 第7.15节 Python中classmethod定义的类方法详解
第7.15节 Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一. 类方法的定义 在类中定 ...
- Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?
在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...
- 第11.15节 Python正则表达式转义符定义的特殊序列
一. 引言 在前面<第11.13节 Python正则表达式的转义符"\"功能介绍>介绍了正则表达式转义符'\',只不过当时作为转义符主要是用于在正则表达式中表示元字符自 ...
- 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用
一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...
- day13-类的重写和类的私有方法
类的重写 在python中 有时需要进行重写,重写是继承机制中的一个重要部分, 可以重写一般方法也可以重写构造方法,构造方法是用来初始化新创建对象的状态. class A : def hello(se ...
- python类的__repr__方法
python3中的类默认是新式类(继承object类). __repr__()是 Python 类中的一个特殊方法,由于 object 类己提供了该方法, 而所有 的 Python 类都是 objec ...
- WebService中使用自定义类的解决方法(5种)
转自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html Demo下载:http://files.cnblogs.com/lx ...
随机推荐
- 3.5 MyLinkedList 实现
3.5 MyLinkedList 类的实现 MyLinkedList 将用双链表实现,并且还需要保留该表两端的引用.这将需要三个类 MyLinkedList 类,包含到两端的链.表的大小以及一些方法. ...
- z-index属性详解
z-index属性详解 目录 z-index属性详解 一.定义和用法 二.代码 三.效果图 一.定义和用法 z-index属性指定一个元素的堆叠顺序,也就是z轴 position属性定义的是x轴和y轴 ...
- sublime中插件
AllAutocomplete Emmet
- 6 MyISAM和InnoDB
6 MyISAM和InnoDB MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好.甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直 ...
- layui表单一
1. ***首先明确一点 表单的以来加载模块是 form.如果不加载form模块,select.checkbox.radio等将无法显示,并且无法使用form相关功能. 我们用layui官网的样本来做 ...
- LSV又新增13个地质图!量测对比分析全都能搞定
对于地质工作者来说,地质图是个十分重要的参考资料.随着国家解密的地质资料越来越多,能够有效的把各种地质资料结合起来,进而提高地质工作者的作业效率,是十分有意义的. LSV(LocaSpaceViewe ...
- ohmyzsh的安装过程中失败拒绝连接问题的解决
1.打开官网https://ohmyz.sh/ 在官网能看到下面的界面 有这两种自动安装的方式 个人本次选择的是: wget https://raw.github.com/ohmyzsh/ohmyzs ...
- python之 socketserver模块的使用
在我们正常的使用socket模块来写一个server的程序就会显得比较的复杂通常一般流程为 1.生成socket实例对象 2.绑定地址 3.开始监听 4.接收数据 一般demo为 # 服务器 impo ...
- 基于Docker UI 配置ceph集群
前言 前一篇介绍了docker在命令行下面进行的ceph部署,本篇用docker的UI进行ceph的部署,目前来说市面上还没有一款能够比较简单就能直接在OS上面去部署Ceph的管理平台,这是因为OS的 ...
- 关于oracle11g 和sqldeverloper的安装配置
0友情提示:以下下载地址都是我的百度云分享链接安全无毒请放心下载! 电脑配置 win10 jdk版本1.7 下载oracle11G 版本 下载地址:安装很简单 sqldverloper(oracleD ...