Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘
摘要
在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__
和__repr__
是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,但它们的用途和输出形式有所不同。本文将深入探讨__str__
和__repr__
的区别,并提供实用的示例,帮助开发者理解并正确使用这两个方法。
一、对象的字符串表示
在Python中,当需要将对象转换为字符串时,解释器会自动调用两个特殊的方法:__str__
和__repr__
。
二、__str__
方法
__str__
方法用于返回对象的“友好”字符串表示,通常用于展示给最终用户。
1. __str__
的用途
- 为对象提供一个易于理解的字符串表示。
- 在打印对象或使用
str()
函数时被调用。
2. __str__
示例
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"Person(name={self.name}, age={self.age})"p = Person("Alice", 30)
print(p) # 输出: Person(name=Alice, age=30)
三、__repr__
方法
__repr__
方法用于返回对象的“官方”字符串表示,通常用于调试和开发。
1. __repr__
的用途
- 为对象提供一个精确的字符串表示,可以用于重新创建该对象。
- 在使用
repr()
函数或在交互式解释器中打印对象时被调用。
2. __repr__
示例
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person(name={self.name!r}, age={self.age!r})"p = Person("Alice", 30)
print(repr(p)) # 输出: Person(name='Alice', age=30)
四、__str__
与__repr__
的区别
虽然__str__
和__repr__
都用于定义对象的字符串表示,但它们的设计目的和输出形式有所不同。
1. 设计目的
__str__
:面向最终用户的友好表示。__repr__
:面向开发者的精确表示。
2. 输出形式
__str__
:通常包含更多描述性文本,易于阅读。__repr__
:通常更简洁,使用准确类型和值。
3. 调用时机
__str__
:在print()
和str()
中调用。__repr__
:在repr()
和交互式解释器中调用。
五、何时使用__str__
和__repr__
- 当你需要提供一个易于理解的字符串表示时,使用
__str__
。 - 当你需要提供一个可以用于调试或重新创建对象的精确字符串表示时,使用
__repr__
。
六、最佳实践
- 总是定义
__repr__
,因为它对于调试非常有用。 - 根据需要定义
__str__
,如果默认的__repr__
输出已经足够友好,可以不定义__str__
。 - 使用
{!r}
格式化字符串,它会自动调用repr()
,确保输出的准确性。
七、示例:自定义集合类
我们将通过一个自定义集合类的例子来展示__str__
和__repr__
的应用。
class MySet:def __init__(self, elements):self.elements = set(elements)def __str__(self):return f"MySet({self.elements})"def __repr__(self):return f"MySet({list(self.elements)})"s = MySet([1, 2, 3])
print(s) # 输出: MySet({1, 2, 3})
print(repr(s)) # 输出: MySet([1, 2, 3])
八、总结
理解__str__
和__repr__
的区别对于编写高质量的Python代码至关重要。__str__
提供了面向用户的友好表示,而__repr__
提供了面向开发者的精确表示。通过正确使用这两个方法,我们可以提高代码的可读性和调试效率。
九、结语
通过本文的介绍,希望开发者能够更加清晰地理解__str__
和__repr__
的区别,并在实际编程中正确地使用它们。记住,良好的字符串表示习惯不仅能提升代码的可读性,还能在调试过程中提供巨大的帮助。
相关文章:
Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘 摘要 在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,…...

gazebo插入一个图片
在下面的目录下添加文件夹 my_ground_plane 文件夹内容如下 model.sdf <?xml version"1.0" encoding"UTF-8"?> <sdf version"1.4"><model name"my_ground_plane"><static>true</static><link na…...
(已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
Modals是Bootstrap中用户弹框用的组件,使用时不需要额外引入其他插件,在引入了boostrap.js或者boostrap.min.js前提下就可以使用。 官方的示例: <!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-bs-…...
网络编程介绍(IP)(一)
定义:可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 java.net.*包下提供了网络编程的解决方案。 基本的通信架构: CS架构( Client客户端/Server服务端 ): Clie…...

C语言 指针——函数指针
目录 什么是函数指针? 函数指针的定义 定义函数指针时的常见错误 函数指针有什么用? 函数指针的主要应用 什么是函数指针? 函数指针 (Function Pointer) 就是指向函数的指针变量 数据类型 ( * 指针变量名 ) ( 形参列表 ); 例如&#x…...

【C++】———list容器
前言 1.list容器简单来说其实就是之前的链表结构。 2.这里的list用的是双向带头结点的循环链表。 目录 前言 一 构造函数 1.1 list (); 1.2 list (size_type n, const value_type& val value_type() ); 1.3 list (InputIterator first, InputIterator last…...

【网络安全技术】——期末复习(冲刺篇)
📖 前言:快考试了,做篇期末总结,都是重点与必考点。 题型:材料分析题、简答题、看图分析题 课本: 目录 🕒 1. 计算机网络安全概述🕘 1.1 安全目标🕘 1.2 常见的网络安全…...

Python中Web开发-Django框架
大家好,本文将带领大家进入 Django 的世界,探索其强大的功能和灵活的开发模式。我们将从基础概念开始,逐步深入,了解 Django 如何帮助开发人员快速构建现代化的 Web 应用,并探讨一些最佳实践和高级技术。无论是初学者还…...

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…...

LeetCode 两两交换链表中的节点
原题链接24. 两两交换链表中的节点 - 力扣(LeetCode) 思路,请看图片的过程模拟,这里添加了一个哨兵节点0,目的是为了方便操作,得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…...

STM32作业实现(五)温湿度传感器dht11
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决
注意事项: 尽量避免使用下面方式写sql否则会降低服务器性能: mybatis二级缓存开启后,避免使用事务注解(加上事务注解后二级缓存数据会导致两次访问不一致问题): 3. 返回的对象实体类,要实现Se…...

在 LLM 架构中应用多专家模型
本文转载自:在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…...
C语言编程代码软件:深入探索与实战应用
C语言编程代码软件:深入探索与实战应用 在编程的广袤领域中,C语言以其独特的魅力吸引着无数编程爱好者。作为一种基础且强大的编程语言,C语言在软件开发、系统编程、嵌入式系统等领域发挥着不可替代的作用。而要想熟练掌握C语言,…...
【AIGC半月报】AIGC大模型启元:2024.06(上)
AIGC大模型启元:2024.06(上) (1) ChatTTS(语音合成项目) (1) ChatTTS(语音合成项目) 2024.06.01 ChatTTS 文本转语音项目爆火出圈,引来大家极大的关注。短短三天时间,在…...

两款 IntelliJ IDEA 的 AI 编程插件
介绍两款 IntelliJ IDEA 的 AI 编程插件:通义灵码和 CodeGeeX。 通义灵码 这是由阿里推出的一个基于通义大模型的 AI 编码助手。 它提供了代码智能生成、研发智能问答等功能。通义灵码经过海量优秀开源代码数据训练,可以根据当前代码文件及跨文件的上下…...
语义化版本控制:软件工程的实用之道
语义化版本控制:软件工程的实用之道 在软件开发过程中,版本控制是确保项目稳定、有序进行的关键环节。随着项目的发展,功能的增加、错误的修复以及API的修改变得日益频繁。为了有效管理这些变化,并确保团队成员、用户以及依赖该软…...

Java设计模式总结
《武林外传》老白曾经说过这样一句话。高手就是手里无刀,心中也无刀。 类似于设计模式,你不知不觉中已经融进你的代码中了,但你并不知已经运用了。下面我总结几个我觉得比较常用的设计模式。 1:设计模式分类 总体来说设计模式分为…...

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…...

HCIP-Datacom-ARST自选题库__EBGP【18道题】
一、单选题 1.在排除EBGP邻居关系故障时,你发现两台直连设备使用Loopback口建立连接,故执行display current-configurationconfiguration bgp查看peer ebgp-max-hop hop-count的配置,下列哪项说法是正确的? hop-count必须大于2 hop-count…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...