
在面向对象编程里我们自行定义类接着创建实例对象, 此时要是直接去打印对象, 默认情况下会输出一连串晦暗、难懂的内存地址以及相应的类名信息, 没办法直接、清楚地看到对象的属性数据情况。为了处理这个难题, 给提供了两个关键核心的魔法方法, 专门用来特地自定义对象的打印格式模样, 从而能够然对象输出的内容清晰明了起来、易读易懂些、并适配各种各样不同的使用场景情形下。本文就此将要采用纯文字进行详细解说解析这两个方法的原理道理、区别差异化、使用规则规范以及实战技巧窍门。一、默认对象打印的问题讲得简单点, 两个魔法方法的关键作用都是去重写对象的字符串输出样式, 替换掉系统默认的内存地址输出, 使得对象能够打印出自己定义的、有含义的文本内容。二、方法开发者精准展示是一种相当奇特的缩写形式, 其直译为“表示、描述”, 它所具备的核心定制方向面向的是开发者, 是那种精准无误的输出, 并且它还是对象的底层默认呈现方式。在底层逻辑里, 它是优先级处于最高级别的、作为兜底用途的对象展示方式。要是类之中仅仅定义了它, 不管是直接去打印对象, 在交互式命令行输入对象名称予以查看, 又或者是进行日志输出时, 均会调用这个方法的返回值。它的设计初始目的是精确地还原对象信息, 输出的内容所提出的要求是严谨且完整的, 最好能够借助输出的字符串直接重新构建出完全相同的对象, 以此便于开发者从事调试工作、排查错误以及查看底层的数据状态。方法有着这样一种固定格式, 它的定义是在类的内部进行, 并不需要额外去传递参数, 而且必须返回的数据类型是字符串。要是不通过手动的方式来进行定义, 那系统就会继续使用默认的内存地址输出格式。这个方法具备的核心特点是, 它的通用性极其强大所有关于对象展示的场景它都能够适配, 它就像是对象的“底层默认描述”。三、方法用户友好展示什么的缩写, 核心定位是针对普通用户的友好输出, 着重可读性、简洁性。若我们运用print()函数去打印对象, 运用str()函数将对象转化为字符串时, 会优先调用类里定义的方法, 其设计的初衷在于弱化技术细节, 输出通俗易懂又简洁美观的文本来适配程序最终展示给用户的场景, 这其中并不需要包含完整的底层调试信息。需保持和一致, 且得在类内进行定义, 不存在额外的参数, 其返回的值必定是字符串。要着重加以注意: 它是按照需求来调用的, 仅仅是在打印输出以及字符串转换的场景当中才会生效的状况, 无法实现适应交互式命令行从而直接查看对象的这个场景。四、两大方法核心优先级与调用规则重点有不少刚开始学习的人, 容易把两种方法调用的先后顺序弄混, 这儿归纳出固定的优先等级规则, 能清楚地分辨开所有的情形。第一, 当在类之中同时进行定义以及和的操作时, print()用于打印对象, str() 功能为转换对象, 此时会优先调用一种格式, 它亦被称作用户友好格式在交互式命令行里直接输入对象名, 另一种功能名为 repr()可在此用于转换对象的操作, 此该情况下调用的是开发者精准格式。其次, 在类仅仅进行定义的情形下: 针对所有对象开展展示场景的时候予以统一调用行为, 这里面涵盖了print打印、交互式查看以及类型转换等方面: 最终将会完全进行包底兜底处理。第三点, 当类之中仅仅进行定义的时候, 存在print打印、str转换调用的情况, 然而在交互式命令行直接查看对象, 以及repr转换对象的时候, 将会调用系统默认的内存地址格式, 并且不会进行复用。首先, 第四点, 当类里的两个方法都不进行定义的情况下, 就会发生这样的情况, 所有的场景都会统一输出系统默认的类名添加内存地址的格式。五、核心区别总结极简记忆能从使用人群之中以及输出风格里头, 还有适用场景方面, 以这三个维度, 迅速地将两个方法区分开来。1. 在所面向的人群方面存在差异, 服务方向不是一种, 而是两种, 一种是向着开发者的, 其应用作用是用于调试、并且用于开发、还要用于排错, 另一种是面向普通用户的, 其发挥的用途是用于页面展示、以及用于终端普通输出。2. 呈现出不一样的输出风格, 一种是, 力求精准、完备、能够还原对象, 且要细节周全另一种是, 追求简洁、易于理解、具备美观性, 同时要去除技术方面的细节。3. 兜底能力存在差异, 一种是全局兜底方法, 任何时候都无法替代所有场景, 另一种仅适配打印场景, 不存在兜底能力。六、行业通用编程规范于实际的项目开展进程当中, 行业规定了统一的最优操作方式规范, 以求防止出现输出杂乱无章的状况, 同时适配开发以及用户这两种不同的场景。其一, 优先去定义, 方法, 要确保在所有的场景之下, 对象都能够拥有清晰的、精准的输出, 以此满足开发调试的需求, 进而避免默认的内存地址乱码。其二, 要是业务有着对外展示对象信息的需求, 那就额外去定义方法。定制出简洁且友好的用户输出格式, 还要区分开开发调试以及用户展示的场景。首先, 返回值得严格确保是字符串, 其次, 两个方法所返回的值全必然得是字符串类型, 不然的话, 将会直接跑出类型给出的报错, 此情形可是初学者极易踏入的坑。第四输出务必要尽可能具备可复现性, 在规范的开发写法里, 其输出的字符串最好呈合法的代码状, 能够直接予以复制来执行, 进而得以重新实例化对象。七、常见误区答疑误区之一: 觉得两个办法只能二者选其一。事实上, 在项目里面, 常常会同时去定义两个办法, 它们各尽其责, 分别去适配开发调试以及用户展示的场景, 彼此之间不会产生冲突。误区二: , 它的优先级是高于。这种说法并非完全精准, 仅仅是在print打印、str转换这些特定场景之中才会优先, 而在其余的场景里面, 其优先级还要更高, 并且还具有具备兜底的那种能力。存在这样一个误区三, 即不写返回值, 或者返回数字、列表等类型。然而, 两个魔法方法有着强制要求, 那就是必须返回字符串, 不然的话, 其他所有的数据类型都会触发程序异常, 在这种情况下, 返回内容必须要用引号进行包裹。八、全文总结面向对象里和是优化对象输出所要用到的核心魔法方法。它们的本质皆是自定对象字符串格式。其中是底层基础, 主要提供给开发者进行调试用的, 具有精准全面和全局兜底的特点。是上层展示, 主要强调要对用户友好, 做到简洁易懂, 适用于专属的打印场景。彻底解决对象打印乱码问题, 以此让代码调试效率更高, 且输出展示更规范, 这需要掌握两个方法的核心优先级规则以及使用场景, 而这是面向对象编程所必须掌握的基础核心知识点。