一、 引言

上节结合案例介绍了重写__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. Reactor:深入理解reactor core

    目录 简介 自定义Subscriber Backpressure处理 创建Flux 使用generate 使用create 使用push 使用Handle 简介 上篇文章我们简单的介绍了Reactor ...

  2. JavaSE基础语法学习-流程控制

    流程控制 用户交互Scanner Scanner**对象** 下面是创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); 接下来我们演示一个最 ...

  3. kubernetes-1.18.2集群安装-02

    一.基础配置 修改主机名 # 在 172.17.32.23 上:hostnamectl set-hostname k8s-master01bash​# 在 172.17.32.38 上:hostnam ...

  4. Servlet与通信协议概述

    Servlet 是一个java应用程序,一个Servlet应用有一个或多个Servlet程序,JSP页面会被转换和编译成Servlet程序. Servlet应用无法独立运行,必须运行在Servlet容 ...

  5. http代理阅读2

    向上游服务器发送请求处理 static void ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t * ...

  6. IP 层收发报文简要剖析5--ip报文发送2

    udp 发送ip段报文接口ip_append_data ip_append_data 函数主要用来udp 套接字以及raw套接字发送报文的接口.在tcp中发送ack 以及rest段的ip_send_u ...

  7. 402. 移掉K位数字

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k.num 不会包含任何前导零.示例 1 : 输入: num ...

  8. 创建Grafana监控视图

    前言 Grafana允许查询,可视化,警报和了解指标,无论它们存储在哪里. 可视化:具有多种选项的快速灵活的客户端图.面板插件提供了许多不同的方式来可视化指标和日志. 动态仪表盘:使用模板变量创建动态 ...

  9. python之路《七》文件的处理

    其实我觉得python的方便之处就是简便特别是对数据的处理上 当我们要处理一些数据的时候免不了的就是要处理许多的文件那么下面就让我们来看一下文件的处理 1.打开文件 python的文件打开方式较为简单 ...

  10. Natapp内网穿透服务工具

    在做微信开发的时候,调用微信接口成功之后,微信会回调我们事先配置好的一个接口.由于微信的服务是在外网的,所以这个回调接口也只能是外网,而且微信要求回调接口只能是通过ICP备案的域名,不能使用IP,所以 ...