深入理解Python对象的字符串表示:`__str__`与`__repr__`的区别与应用

在Python编程中,我们经常需要将对象转换为字符串形式,无论是为了打印输出还是进行字符串操作。Python提供了两种特殊的方法来定义对象的字符串表示形式:__str____repr__。本文将详细讲解这两种方法的区别、用途以及如何在实际编程中使用它们。

基本原理

在Python中,当需要将对象转换为字符串时,解释器会自动调用对象的__str____repr__方法。这两种方法都定义了如何返回对象的字符串表示,但它们的目的和使用场景有所不同。

  1. __str__方法:用于创建一个“信息版”的字符串表示,通常用于交互式环境和打印输出。它应该返回一个字符串,并且当用户打印一个对象时,通常会调用这个方法。

  2. __repr__方法:用于创建一个“官方版”的字符串表示,它应该返回一个字符串,这个字符串可以被eval()函数安全地转换回该对象(如果可能的话)。它用于调试和开发者之间的通信,应该尽可能地返回一个完整的、准确的对象表示。

示例代码

为了更好地理解这两种方法,下面通过几个示例来展示它们的使用。

示例1:定义一个简单的类并实现__str____repr__
class Student:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"Student(name: {self.name}, age: {self.age})"def __repr__(self):return f"Student('{self.name}', {self.age})"# 创建一个Student对象
student = Student('Alice', 20)# 使用print()函数打印对象
print(student)  # 调用__str__方法
print(repr(student))  # 调用__repr__方法

运行结果:

Student(name: Alice, age: 20)
Student('Alice', 20)
示例2:__repr__方法与eval()函数
import math# 使用__repr__方法返回一个可以被eval()转换回对象的字符串
class Circle:def __init__(self, radius):self.radius = radiusdef __repr__(self):return f"Circle({self.radius})"# 创建一个Circle对象
circle = Circle(5)# 使用repr()函数获取对象的字符串表示,并用eval()尝试转换回对象
circle_repr = repr(circle)
new_circle = eval(circle_repr)print(circle_repr)  # Circle(5)
print(new_circle)    # Circle对象,其radius属性为5
示例3:自定义异常类的__str____repr__
class CustomError(Exception):def __init__(self, message):super().__init__(message)self.message = messagedef __str__(self):return f"An error occurred: {self.message}"def __repr__(self):return f"CustomError({repr(self.message)})"# 引发自定义异常
try:raise CustomError("Something went wrong!")
except CustomError as e:print(e)  # 调用__str__方法print(repr(e))  # 调用__repr__方法

运行结果:

An error occurred: Something went wrong!
CustomError('Something went wrong!')
注意事项
  1. 默认实现:如果只定义了__repr__而没有定义__str__,当调用str()时会使用__repr__的结果。
  2. 安全性__repr__应该返回一个安全的字符串表示,可以被eval()安全地转换回对象。
  3. 可读性__str__应该返回一个易于阅读的字符串,适合最终用户。
  4. 一致性:理想情况下,eval(repr(x))是等价于x的。

通过上述示例和解释,我们可以看到__str____repr__在Python中扮演着不同的角色。__str__更侧重于提供给用户一个友好的字符串表示,而__repr__则侧重于提供给开发者一个精确的、可以用于调试的字符串表示。在实际编程中,根据需要选择合适的方法来定义对象的字符串表示形式是非常重要的。

结语

理解__str____repr__的区别对于编写清晰、可维护的Python代码至关重要。希望本文能够帮助初学者和有经验的开发者更好地掌握这两种方法的用途和实现方式。记住,良好的编码习惯和对语言特性的深入理解将使你成为一名更优秀的Python程序员。

【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4 (1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。

(2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。

(3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。

下载地址:https://www.lanzoub.com/b00rn0g47e 密码:9hww

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BA112协议网关促进楼宇自控系统与OPC UA平台集成

在当今智能化建筑的潮流下,楼宇自控系统的发展已成为建筑行业的重要趋势。然而,由于不同厂商生产的楼宇自控设备使用的通信协议多样,导致了设备之间的互联互通存在困难。为了解决这一问题,钡铼技术最新推出了BACnet转OPC UA网关BA…

企业网站慎用免费SSL证书!OV证书才是首选

市面上有很多免费证书提供,免费的SSL证书更适用于个人博客、学生学习、测试等应用场景。如果您的网站是企业网站一定慎用免费的SSL证书,而是选择企业级的OV证书。 一.免费SSL证书的风险 1安全性:免费SSL证书通常只提供基本的加密…

景区AR导览导航语音播报小程序系统开发源码搭建

开发景区AR导览导航语音播报小程序系统需要以下步骤: 1. 确定需求:明确系统需要实现的功能,如AR导览、导航、语音播报等。 2. 设计系统架构:根据需求设计系统的架构,包括前端和后端。前端需要实现AR导览、导航、语音…

中学数学研究杂志中学数学研究杂志社中学数学研究编辑部2024年第4期目录

教学纵横 高中数学选择性必修课程函数主线分析 柳双;吴立宝; 1-4 贯彻新课程理念 促学习能力提升——以“三角函数诱导公式”教学为例 陆雨轩; 4-6《中学数学研究》投稿:cn7kantougao163.com 对高中数学新课标教材新增知识点的价值分析 钱伟风;刘瑞美; …

2024电商数据资料汇总

2024年跨境电商:连接全球市场的新纪元 随着全球数字化进程的不断推进,跨境电商已经成为了国际贸易的重要组成部分。2024年,跨境电商行业迎来了一系列挑战和机遇,塑造了全新的市场格局。 跨境电商市场规模的持续扩大 2024年&…

MASK-RCNN自定义数据集优化思路(pytorch)

MASK-RCNN自定义数据集优化思路(pytorch) 调整优化器GSD->AdamW也许有用不使用imagenet的标准化参数(std,mean),计算自己数据集的标准化参数传入进行训练.(如果模型照片不是通用图像也许表现会跟好)如果细长条的对象无法被准确识别,尝试调整AnchorGenerator的aspect_ratios…

嵌入式开发基础(一)-数据类型

数据类型 基本类型 int number ; /*定义整型变量*/ float fFloat; /*定义浮点型变量*/ char cChar; /*定义字符型变量*/ enum Fruits(Watermelon,Mango,Grape); /*定义枚举变量*/ 构…

postgresql允许外部访问

要允许PostgreSQL数据库接受外部连接,你需要通过编辑PostgreSQL的配置文件来修改其监听设置和访问控制规则。下面是具体的步骤: 1. 修改postgresql.conf文件 这个文件控制着PostgreSQL服务器的运行时行为,包括监听的地址。 定位配置文件&am…

微盟与管易云对接集成查询订单列表打通仓库新增

微盟与管易云对接集成查询订单列表打通仓库新增 数据源平台:微盟 微盟为众多商家提供海量应用与产品服务,并面向电商零售、商超生鲜、餐饮、跨境、美业等行业提供数字化升级解决方案。基于近10年商业实践,微盟构建了微盟WOS新商业操作系统,为…

大米自动化生产线揭秘:包装设备选择与维护之道

在现代化的大米生产过程中,自动化生产线的应用已经越来越广泛。其中,包装设备作为生产线上的重要一环,其选择与维护直接关系到产品的质量和生产效率。与星派一起探讨大米自动化生产线中包装设备的选择与维护之道。 一、包装设备的选择 在选择…

pycharm虚拟环境

File->setting->project->Python interpreter 路径必须写全

17、Flink 的 Checkpointing 配置详解

Checkpointing 1.概述 Flink 中的每个方法或算子都能够是有状态的,状态化的方法在处理单个 元素/事件 的时候存储数据,为了让状态容错,Flink 需要为状态添加 checkpoint(检查点)。 2.开启与配置 Checkpoint 默认 c…

指针读取文件(简单、干净的知识点罗列)

一.基本操作 FILE *fp;//定义一个文件指针 fpfopen("打开文件名","打开方式");//把文件指针具体的去指向一个文件 //然后对文件进行操作 fclose(fp);//要关闭文件 二.对文件操作的函数 Ⅰ: 1)fgetc函数: 功能:从f…

Vue2前端增加上下文

需求描述: 1- 项目部署时存在两个Nginx, 一个Nginx支持vue项目的基本配置, 但是项目入口要配置在上一层Nginx上, 而且上一层Nginx包装了一层上下文; 2- 页面跳转时要保持上一层Nginx的上下文; 3- URL可以正常刷新 方案一: 上层Nginx的上下文转发时不转发到下层Nginx, 只做一…

git中的rebase命令与merge命令

使用git rebase的情境 使用rebase的原因:在 Git 中使用 rebase 命令通常是为了将一系列的更改从一个分支重新应用到另一个分支上。这样做主要是基于下面这种情境: 假设你正在一个特性分支上开发(例如 feature 分支),而…

海外静态IP购买指南:探索全球网络连接的奥秘

在数字化时代,互联网连接的重要性不言而喻。对于企业和个人而言,拥有稳定、高速的网络连接是成功的关键。而在特定应用场景下,如远程办公、跨境电商、服务器托管等,海外静态IP地址的需求日益凸显。本文将为您详细解读海外静态IP购…

object.key()用法

object.key(obj) 一、概念:返回一个由一个给定对象的自身可枚举属性组成的数组。 二、用法: 1、参数为对象:则返回为 对象属性名组成的数组。 let obj {日期:date,姓名:userName,地址:address}console.log(Object.k…

国产化开源鸿蒙系统智能终端RK3568主板在电子班牌项目的应用

国产化开源鸿蒙系统智能终端主板AIoT-3568A、人脸识别算法的的电子班牌方案可支持校园信息发布、人脸识别考勤、考场管理、查询互动等多项功能,助力学校在硬件上实现信息化、网络化、数字化,构建“学校、教师、学生”三个维度的智慧教育空间。 方案优势 …

HTTP调用API框架Forest

Forest是一个高层的、极简的声明式HTTP调用API框架 相比于直接使用Httpclient您不再用写一大堆重复的代码了&#xff0c;而是像调用本地方法一样去发送HTTP请求 maven <dependency><groupId>com.dtflys.forest</groupId><artifactId>forest-spring-b…

事件高级。

一、注册事件&#xff08;绑定事件&#xff09; 就是给元素添加事件 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 1 传统注册方式 方法监听注册事件 2、 addEventListener 事件监听方式 里面的事件类型是字符串&#xff0c;必定加引号&#xff0c;而且不带o…