一、 引言

上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息。而__str__方法是为最终用户返回类的相关信息,因此需要相关信息容易理解,更需要开发者在自定义类的过程中重写__str__方法。

object类提供的__str__方法,只是简单输出模块名、类名以及对象的ID信息,老猿认为实际上就是在__str__方法直接调用object类的__repr__方法,不过没去研究代码核实。不管怎样,这个信息根本谈不上用户友好度,因此老猿建议对于重要的与客户交互的类重写类的__str__方法。

二、 重写__str__方法

重写__str__方法注意:

  1. __str__方法是实例方法,因此带一个参数self,也只能带这个参数;
  2. 输出的信息尽可能容易让客户理解;
  3. 可以调用父类的__str__方法,也可以不调用,具体需要根据父类输出信息的情况进行评估是否满足客户友好性。不过老猿建议最好调用,如果父类友好性不够建议修改父类的__str__方法。

    注意:如果类内未重写__str__方法,但重写了__repr__方法了,则调用__str__方法时Python会直接调用__repr__方法。

三、 例子

  1. 例子说明

    本节继续利用上节的Car类来说明__str__方法重写,在类中重写了__repr__方法和__str__方法,__repr__方法重写是用的上节的内容,__str__方法重写返回的信息包括:

    1>证明调用了重写方法的“In str:”提示;

    2>使用中文描述的属性名称,以及对应值。

    另外在信息查看时,特地调用直接查看对象和打印对象查看输出,看看是否与上节的例子输出不同。

  2. 案例代码

    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 def __str__(self):
return "In __str__:\n 实例属性:{} {},车身颜色{}、车重{}吨、百公里油耗{}升".\
format(self.brand,self.type,self.color,self.weight,self.oilcostper100km)

2>实例定义及查看信息()

car = Car('雪佛兰','科帕奇','白色',1.8,10)
car #查看实例信息,此时会调用__repr__方法
print(car) #查看实例信息,此时会调用__str__方法,但没有重写__str__方法,效果会怎样?
  1. 案例截图

  2. 案例总结

    通过上述案例说明:

    1>重写__str__方法后,使用print(对象)查看对象会触发重写方法的调用,其他触发方式请见《第8.14节 Python类中内置方法的__str__详解》,在此不再展开说明;

    2>结合上节的案例一起,这2个案例验证了上节所说明的“自定义类没有重写__str__方法的情况下,Python会直接调用__ repr __方法输出,要输出单独的__str__信息需要重写__str__方法”。

本节结合案例介绍了 __str__方法的重写,可以看到通过重写该方法如果输出数据得当,相关信息有利于最终用户理解。

老猿Python,跟老猿学Python! 博客地址:https://blog.csdn.net/LaoYuanPython

第8.16节 Python重写自定义类的__str__方法的更多相关文章

  1. 第8.15节 Python重写自定义类的__repr__方法

    一. 引言 前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中, ...

  2. Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?

    这是因为Python3中,str的输出是调用类的实例方法__str__来输出,如果__str__方法没有重写,则自动继承object类的__str__方法,而object类的__str__方法是调用_ ...

  3. Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?

    在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...

  4. 第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式

    一. 什么是组 关于组匹配模式,Python官网上说得比较简单,也没有这个名词,只有组这个名词,老猿查了比较多的资料和做了相关测试之后才理解. 组匹配模式,就是在匹配的正则表达式中使用小括号" ...

  5. 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用

    一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...

  6. day13-类的重写和类的私有方法

    类的重写 在python中 有时需要进行重写,重写是继承机制中的一个重要部分, 可以重写一般方法也可以重写构造方法,构造方法是用来初始化新创建对象的状态. class A : def hello(se ...

  7. WebService中使用自定义类的解决方法(5种)

    转自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html Demo下载:http://files.cnblogs.com/lx ...

  8. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  9. 第6.2节 Python特色的动态可执行方法简介

    一.    基本概念 动态可执行,是指在代码中通过外部输入或代码嵌入的常量字符串包含代码的方式提供Python代码,要求Python执行这些代码.这样就可以达到开放式运行的效果,提高程序的能力和灵活性 ...

随机推荐

  1. JVM 整体回顾(一)

    JAVA虚拟机整体的回顾,为提纲类型 JAVA虚拟机是装在操作系统之上的一个应用软件[平台性质],作用是:将class格式的字节码编译成可执行的机器码.从而,class格式和物理机无关.也就是所谓的j ...

  2. MySQL全面瓦解7:查询的过滤条件

    概述 在实际的业务场景应用中,我们经常要根据业务条件获取并筛选出我们的目标数据.这个过程我们称之为数据查询的过滤.而过滤过程使用的各种条件(比如日期时间.用户.状态)是我们获取精准数据的必要步骤, 这 ...

  3. 剑指Offer-Python(11-15)

    11.二进制中1的个数 链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8?answerType ...

  4. 面试题:能谈谈Date、Datetime、Time、Timestamp、year的区别吗?

    一. 推荐阅读 首发地址:https://mp.weixin.qq.com/s/9zKX86P4kzlKla6-NyS3EA 使用推荐阅读,有更好的阅读体验 二.准备 如果面试官问你:了解 date. ...

  5. 内网渗透 day1-基础

    粘滞键和放大镜 1. 到/windows/system32下用takeown改变该文件夹下的文件拥有权(因为粘滞键和放大镜都在system32文件夹下) cd /Windows/system32    ...

  6. SpringBoot 构建 Docker 镜像的最佳 3 种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...

  7. 可变参数以及stdcall

    void event_warnx(const char *fmt, ...) EV_CHECK_FMT(1,2); #define EV_CHECK_FMT(a,b) __attribute__((f ...

  8. ceph osd tree的可视化

    前言 很久没有处理很大的集群,在接触一个新集群的时候,如果集群足够大,需要比较长的时间才能去理解这个集群的结构,而直接去看ceph osd tree的结果,当然是可以的,这里是把osd tree的结构 ...

  9. JavaScript高级程序设计(第四版) -- 随笔 -- 数组(未完)

    数组方法 .every() 与 .some() 传给两个个方法的函数都接收3个参数:数组元素.元素索引和数组本身. .every() -- 对于每一项都需要返回true,它才会返回true 若中途有一 ...

  10. 放弃腾讯75W年薪,回老家当公务员,提离职被领导教育。网友:leader嫉妒了

    最近一位腾讯员工自爆,"老家公务员政审已过,放弃腾讯75w年薪,提了离职被leader教育了".并且这位员工还晒出了领导"教育"自己的聊天记录,引发网友们的热议 ...