Python中的__repr__() __str__()

__repr__()

__repr__() 是 Python 中的一个特殊方法(也称为 “dunder” 方法,由 “double underscore” 缩写而来)。当调用一个对象的 repr() 函数或者在控制台中打印一个对象时,这个方法就会被调用。它的目标是返回一个字符串,这个字符串应该是一个合法的 Python 表达式,当通过 eval() 执行时,可以复现这个对象(尽管在实践中,很多时候我们不需要或不可能实现这种复现性)。

__repr__() 的主要目的是为调试和开发提供明确性。这个返回的字符串应该尽量详细,对于开发人员来说应该是明确的。

例如,对于之前的 Person 类:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person(name={self.name}, age={self.age})"

如果我们创建一个 Person 对象:

p = Person("John", 30)

然后在控制台或代码中尝试打印这个对象:

print(p)

输出将会是:

Person(name=John, age=30)

没有 __repr__(),我们可能只会得到一个不太有用的字符串,比如 <__main__.Person object at 0x7f065209d0>,这个字符串只是告诉我们对象的内存地址,而不是它的内容。

还有另一个与此相关的方法,__str__(),它被 print()str() 调用。如果没有定义 __str__(), 则会默认回退到 __repr__(),但 __str__() 更侧重于为用户提供友好的或简洁的字符串表示。

__str__()

__str__() 是 Python 中的一个魔法方法或特殊方法,用于定义一个对象的"informal"或"nicely printable"的字符串表示。当使用 print() 函数或 str() 函数来获取一个对象的字符串表示时,__str__() 方法会被调用。

这个方法的目的是为对象提供一个用户友好的描述,而不像 __repr__() 那样为开发者提供一个严格的描述。换句话说,__str__() 的输出更倾向于为人类读者而设计,而不是为机器或开发者。

下面用一个简单的例子来解释 __str__() 的作用:

class Book:def __init__(self, title, author):self.title = titleself.author = authordef __str__(self):return f"'{self.title}' by {self.author}"# 使用上述的Book类
book = Book("1984", "George Orwell")print(book)  # 输出: '1984' by George Orwell

在上述示例中,__str__()Book 对象提供了一个简洁的描述,这样当我们打印 book 对象时,输出的字符串是用户友好的。如果没有实现 __str__(), Python 通常会回退到使用 __repr__() (如果已经定义)或者输出一个不太有用的默认字符串,例如 <__main__.Book object at 0x7f065209d0>

示例

让我们继续使用上述的 Person 类作为例子。在下面的示例中,我们将同时实现 __repr__()__str__() 方法:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):# 为开发者提供明确性,通常更详细,尽量确保能通过eval()复现对象(尽管并不总是这样)return f"Person(name='{self.name}', age={self.age})"def __str__(self):# 为最终用户提供易读性,更友好、简洁return f"{self.name}, {self.age} years old"

现在,当我们创建一个 Person 对象并尝试打印它:

p = Person("John", 30)print(repr(p))  # 使用 __repr__
# 输出: Person(name='John', age=30)print(p)  # 默认使用 __str__
# 输出: John, 30 years oldprint(str(p))  # 显式地使用 __str__
# 输出: John, 30 years old

可以看到,当尝试直接打印对象或使用 str() 时,__str__() 被调用,而当使用 repr() 时,__repr__() 被调用。如果类中没有定义 __str__(), 则直接打印或使用 str() 的调用会回退到 __repr__()


当我们谈论 __repr__() 为对象提供一个明确且尽量能够通过 eval() 复现的表示时,意味着该方法返回的字符串,当作为 Python 表达式执行时,应该尽可能地创建一个与原始对象等价或相似的对象。

下面用一个例子来解释这个概念:

class Point:def __init__(self, x, y):self.x = xself.y = ydef __repr__(self):return f"Point({self.x}, {self.y})"# 使用上述的Point类
p = Point(3, 4)# 打印对象的repr表示
print(repr(p))  # 输出: Point(3, 4)# 使用eval函数来执行repr返回的字符串,创建一个新的对象
new_p = eval(repr(p))# 验证新对象的属性
print(new_p.x)  # 输出: 3
print(new_p.y)  # 输出: 4

在上述例子中,Point 类的 __repr__() 方法返回一个字符串,这个字符串看起来像是一个调用 Point 构造函数的表达式。当我们用 eval() 函数执行这个字符串时,它实际上创建了一个新的 Point 对象,其属性与原始对象相同。

这种方法使得 __repr__() 产生的输出对于调试和记录非常有价值,因为它提供了创建相同对象的明确“配方”。然而,请注意,并不总是可能或适合确保 __repr__() 的输出可以完全通过 eval() 复现,尤其是当对象的初始化涉及非常复杂的参数或状态时。在这些情况下,__repr__() 的目标仍然是提供尽可能明确和有用的描述。

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

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

相关文章

用手势识别来测试视力?试试用百度AI来实现想法

文章目录 ⭐ 前言⭐ 灵感来源⭐ 项目准备⭐ 项目实现⭐ 不足与展望 ⭐ 前言 10月17日&#xff0c;以“生成未来&#xff08;PROMPT THE WORLD&#xff09;”为主题的百度世界2023将在北京首钢园举办。百度创始人、董事长兼首席执行官李彦宏将带来以“手把手教你做AI原生应用”…

git 项目管理操作

git stash: 保存当前工作进度 git stash save message... : 添加一些注释。 git stash pop : 恢复最新的进度到工作区 git remote prune origin&#xff1a;将本地分支与已删除的远程分支同步 git branch -d <branch-name> &#xff1a;删除分支 git branch -D <branc…

【安全】linux audit审计使用入门

文章目录 1 audit简介2 auditctl的使用2 audit配置和规则3 工作原理4 audit接口调用4.1 获取和修改配置4.2 获取和修改规则4.3 获取审计日志 5 audit存在的问题5.1 内核版本5.2 审计日志过多造成的缓存队列和磁盘问题5.2 容器环境下同一个命令的日志存在差异 6 参考文档 1 audi…

axios调用springboot项目接口获取数据简述版

简述版 前端 <div idZjw> <table> <tr v-for"item in all"><td>{{item.cno}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td><img :src"item.picUrl" style"height: 130px;…

【`opencv_core` 和 `opencv_imgcodecs` 是 OpenCV(开源计算机视觉库)的两个主要模块】

opencv_core 和 opencv_imgcodecs 是 OpenCV&#xff08;开源计算机视觉库&#xff09;的两个主要模块。下面简要描述这两个模块的主要功能&#xff1a; opencv_core: 这是 OpenCV 的核心模块&#xff0c;为其他 OpenCV 模块提供了基础的数据结构和函数。它包含了基本的数据类型…

睿趣科技:未来抖音开网店还有前景吗

随着科技的快速发展&#xff0c;电商平台已经成为了人们生活中不可或缺的一部分。在中国&#xff0c;抖音作为一个短视频平台&#xff0c;近年来迅速崛起&#xff0c;吸引了大量的用户和商家。那么&#xff0c;在未来&#xff0c;抖音是否还能为商家提供一个有效的电商平台呢?…

1688关键字搜索接口

1688关键字搜索接口&#xff0c;即item_search接口&#xff0c;是一个通过API接口进行程序操作的工具。它通过将买家在前端页面输入的关键字转化为后端服务器能够识别的格式&#xff0c;从而实现对指定关键字进行搜索&#xff0c;并返回相关结果。使用该API不仅可以省去繁琐的手…

本土元素的魔力:品牌的全球化之路

随着全球化的不断推进&#xff0c;越来越多的企业正积极寻求国际市场上的机会。然而&#xff0c;进军国际市场并不是一项容易的任务&#xff0c;需要深思熟虑的战略和坚定的决心。在这个竞争激烈的环境中&#xff0c;一种被称为“本土化”的战略变得越来越重要。这种策略强调的…

Bootstrap-媒体类型

加上媒体查询之后&#xff0c;只有在特定的设备之下才能起作用&#xff01;&#xff01;&#xff01;

前端--CSS

文章目录 CSS的介绍 引入方式 代码风格 选择器 复合选择器 (选学) 常用元素属性 背景属性 圆角矩形 Chrome 调试工具 -- 查看 CSS 属性 元素的显示模式 盒模型 弹性布局 一、CSS的介绍 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精…

Django实战项目-学习任务系统-用户注册

接着上期代码框架&#xff0c;开发第2个功能&#xff0c;用户注册&#xff0c;在原有用户模型基础上&#xff0c;增加一个学生用户属性表&#xff0c;用来关联学生用户的各种属性值&#xff0c;这个属性表是参考网络小说里系统属性值设计的&#xff0c;方便直观了解用户的能力高…

堆专题2 向上调整构建大顶堆

题目&#xff1a; 样例&#xff1a; 输入 6 3 2 6 5 8 7 输出 8 6 7 2 5 3 思路&#xff1a; 向上调整&#xff0c;就是从叶子结点开始 往 根节点 往上面调整&#xff0c;操作与 向下调整 操作类似&#xff0c;只是不用判断左右孩子&#xff0c;由于我们是从叶子结点开始 往 …

程序题:从对象中排除指定的属性并返回新对象

let objData {name: 小草莓,age: 18,sex: 女,hobby: [学习]}let objDefault {name: 小草莓,age: 18} /*** 从对象中排除指定的属性并返回新对象* param {Object} originObj 源对象* param {Array} arr 指定排除的属性名数组&#xff0c;如&#xff1a;[name, text]* returns …

视频太大怎么压缩变小?超过1G的视频这样压缩

视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;很多时候&#xff0c;我们可能会遇到视频文件过大&#xff0c;无法在某些平台上传或保存的问题。那么&#xff0c;如何将过大的视频文件压缩变小呢&#xff1f; 下面就给大家分享三款实用的工具&…

STM32单片机入门学习(六)-光敏传感器控制LED

光敏传感器模块和LED接线 LED负极接B12,正极接VCC 光敏传感模块一DO端接B13,GND接GND&#xff0c;VCC接VCC,AO不接。 如图&#xff1a; 主程序代码&#xff1a;main.c #include "stm32f10x.h" #include "Delay.h" //delay函数所在头文件 #include …

【教学类-35-04】学号+姓名+班级(中3班)学号字帖(A4竖版2份 竖版长条)

图片展示: 背景需求: 2022年9-2023年1月我去过小3班带班&#xff0c;但是没有在这个班级投放过学具&#xff0c;本周五是我在本学期第一次带中3班&#xff0c;所以提供了一套学号描字帖。先让我把孩子的名字和脸混个眼熟。 之前试过一页两套名字的纸张切割方法有&#xff1a;…

cocos2d-x Android原生平台与Lua交互

版本&#xff1a; cocos2d-x 语言&#xff1a; C/Java/Lua 简介 cocos2d-x原生平台Android 接入第三方SDK, 需要了解LuaJavaBridge的使用。 它封装了用于Java和Lua的相互调用, 其调用通过C为中介&#xff0c;简要的流程&#xff1a; Lua调用Java: Lua -> C -> Java J…

机器人制作开源方案 | 双轮提升搬运小车

1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备&#xff0c;它通常采用双轮驱动和提升装置。一般具备以下特点&#xff1a; ① 双轮驱动&#xff1a;该小车配备两个驱动轮&#xff0c;通过电动机或其它动力源驱动&#xff0c;提供足够的动力和扭矩&#xff0…

IOT 围炉札记

文章目录 一、蓝牙二、PAN1080三、IOT OS四、通讯 物联网&#xff08;英文&#xff1a;Internet of Things&#xff0c;缩写&#xff1a;IoT&#xff09;起源于传媒领域&#xff0c;是信息科技产业的第三次革命。物联网是指通过信息传感设备&#xff0c;按约定的协议&#xff0…

社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD

本篇技术研报由 MoveBit 研究团队的 Jason 撰写 #1 Sui Staking 介绍 1.1 Sui 网络概述 Sui 网络由一组独立的验证者运行&#xff0c;每个验证者在自己的机器或集群上运行独立的 Sui 软件实例。 Sui 采用委托权益证明&#xff08;DPoS&#xff09;来确定哪些验证者参与网络…