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


    一、 引言
    前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中,应该重写相关方法,特别是__str__输出的应该是用户关注的容易理解的信息,因此对那些负责与客户交互的类,至少更应该重写__str__方法。
    二、 重写__repr__方法
    object类提供的__repr__方法,只是简单输出模块名、类名以及对象的ID信息,如果开发者要输出开发人员足够知悉的属性,就需要重写该方法。
    重写__repr__方法注意:

    1. __repr__方法是实例方法,因此带一个参数self,也只能带这个参数;
    2. 输出的信息尽可能满足开发者的要求,信息必须详尽和准确;
    3. 可以调用父类的__repr__方法,也可以不调用,需要看开发时输出信息的安排,老猿建议最好调用,这样不用子类开发者去考虑父类的信息怎么输出。
      三、 例子
    4. 例子说明
      本节利用Car类来说明__repr__方法,在类中重写了__repr__方法,返回的信息包括:
    1. 证明调用了重写方法的“In repr:”提示;
    2. 调用repr(self.class),id(self)获取的对象的类名和ID基础信息;
    3. 使用__dict__特殊属性输出类的自定义属性及值的字典数据。
    1. 案例代码
      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__:
        <{} object at {:#016x}>
    ".format(repr(self.__class__),id(self) )#使用类相关的信息输出类名和实例ID
            s+=super().__repr__() #直接调用object.__repr__方法输出类信息和实例ID
            #通过实例的self.__dict__获取实例的详细属性信息,注意使用了repr函数去获取字典信息字符串
            s+='
    '+repr(self.__dict__)
            return s
    

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

    car = Car('雪佛兰','科帕奇','白色',1.8,10)
    car #查看实例信息,此时会调用__repr__方法
    print(car) #查看实例信息,此时会调用__str__方法,但没有重写__str__方法,效果会怎样?
    
    1. 案例截图在这里插入图片描述
    2. 案例总结
      通过《第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的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    js汉字转换为阿拉伯数字支持十到十九
    JS中判断是中文数字的函数
    一个JS正则的字符串替换函数
    thinkphp3.2.3使用formdata的多文件上传
    计算列表中的名字出现的订单中的订单总额
    配置ssl使用了不受支持的协议。 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
    IIS8.5中的强制https直接修改web.config文件和顶级域名跳转www和过滤子目录不强制跳转
    关于wordpress4.8中的Twenty Seventeen主题的主题选项增加章节的实现
    excel中统计COUNTIFS的值为0
    thinkphp3.2.3集成phpexcel1.8导出设置单元格合并
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11144509.html
Copyright © 2020-2023  润新知