文章目录

    • 核心概念对比
      • 1. 根本目的差异
      • 2. 调用场景对比
    • 深入解析:何时使用哪种方法
      • 场景 1:开发者调试 vs 用户展示
      • 场景 2:技术表示 vs 简化视图
    • 高级对比:特殊场景处理
      • 1. 容器中的对象表示
      • 2. 日志记录的最佳实践
      • 3. 异常信息展示
    • 最佳实践指南
      • 1. 何时实现哪个方法?
      • 2. 实现原则
      • 3. 默认行为与继承
      • 4. 使用 dataclass 简化
    • 常见陷阱与解决方案
      • 陷阱 1:只实现一个方法
      • 陷阱 2:在 `__str__` 中包含技术细节
      • 陷阱 3:忽略安全性
    • 实际应用:综合示例
    • 总结:`__repr__` 与 `__str__` 的选择策略

在 Python 面向对象编程中,__repr____str__ 是两个最常被混淆的特殊方法。本文将深入解析它们的区别、最佳实践以及如何在实际开发中正确使用它们,避免常见的陷阱。

核心概念对比

1. 根本目的差异

特性__repr____str__
核心目标无歧义的技术表示用户友好的可读表示
目标用户开发者最终用户
设计原则明确性、精确性简洁性、可读性
理想特性eval(repr(obj)) == obj美观、易懂的输出

2. 调用场景对比

class Demo:def __repr__(self):return "Demo.__repr__()"def __str__(self):return "Demo.__str__()"obj = Demo()
操作/场景使用的方法输出示例
print(obj)__str__Demo.__str__()
str(obj)__str__Demo.__str__()
repr(obj)__repr__Demo.__repr__()
交互式环境直接输入 obj__repr__Demo.__repr__()
[obj](在容器中)__repr__[Demo.__repr__()]
f"{obj}"__str__Demo.__str__()
logging.debug(obj)__str__*取决于日志配置

*注意:日志模块默认使用 __str__,但调试时建议显式使用 repr()

深入解析:何时使用哪种方法

场景 1:开发者调试 vs 用户展示

class Product:def __init__(self, id, name, price):self.id = idself.name = nameself.price = pricedef __repr__(self):# 开发者需要看到所有关键信息return f"Product(id={self.id!r}, name={self.name!r}, price={self.price!r})"def __str__(self):# 用户只需要看到友好信息return f"{self.name} - ¥{self.price:.2f}"# 使用示例
p = Product("P1001", "无线耳机", 299.99)print(repr(p))  # 开发者调试: Product(id='P1001', name='无线耳机', price=299.99)
print(p)        # 用户展示: 无线耳机 - ¥299.99

场景 2:技术表示 vs 简化视图

class NetworkDevice:def __init__(self, ip, mac, status):self.ip = ipself.mac = macself.status = statusdef __repr__(self):# 完整技术细节return (f"NetworkDevice(ip={self.ip!r}, mac={self.mac!r}, "f"status={self.status!r})")def __str__(self):# 简化状态显示status_map = {"up": "✓ 运行中", "down": "✗ 已断开"}return f"设备 {self.ip} [{status_map.get(self.status, '?')}]"# 使用示例
router = NetworkDevice("192.168.1.1", "00:1A:2B:3C:4D:5E", "up")print(repr(router))
# 输出: NetworkDevice(ip='192.168.1.1', mac='00:1A:2B:3C:4D:5E', status='up')print(router)
# 输出: 设备 192.168.1.1 [✓ 运行中]

高级对比:特殊场景处理

1. 容器中的对象表示

class Student:def __init__(self, name, grade):self.name = nameself.grade = gradedef __repr__(self):return f"Student({self.name!r}, {self.grade!r})"def __str__(self):return f"{self.name} ({self.grade})"# 创建学生列表
classroom = [Studen

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

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

相关文章

万能公式基分析重构补丁复分析和欧拉公式原理推导

基分析, x11 x2-1 x3i 存在加法法则 x1x20 所以x1-x2 存在链式基乘法法则 x1x1*x1x2*x2 x2x3*x3 x3x1*x3 -x1x2x3 将链式基乘法操作 二次,三次,直至n次化简得 一次 x1 -x1 x3 矩阵 x1 x1 x2 x2 x3 …

OpenCV 4.10.0 移植

OpenCV 4.10.0 移植使用 概述移植编译下载解压编译环境编译 编译完成OpenCV 库文件及其作用 使用实例参考代码 参考 概述 OpenCV(Open Source Computer Vision Library)是计算机视觉领域最广泛使用的开源库之一,提供了丰富的功能模块&#xf…

Tomcat10.0以上版本编译成功但报错HTTP状态 404

Tomcat正常启动且项目已成功部署,但出现404错误。 HTTP状态 404 - 未找到package org.example;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSer…

在Flask项目中用Git LFS管理大文件(PDF)的完整实践

在Flask项目中用Git LFS高效管理大文件(以农机说明书PDF为例) 背景与需求 在农机管理系统等实际项目中,经常需要上传和管理大量超大文件(如200MB以上的PDF说明书、图片等)。如果直接用Git管理这些大文件,不仅会导致仓库膨胀、clone/pull速度变慢,还可能遇到推送失败等…

朴素贝叶斯算法案例演示及Python实现

目录 一、基本原理二、案例演示2.1 未平滑处理2.2 Laplace平滑处理 三、Python实现 一、基本原理 朴素贝叶斯思想:依靠特征概率去预测分类,针对于代分类的样本,会求解在该样本出现的条件下,各个类别出现的概率,哪个类…

RAG从入门到高阶(二):Retrieve-and-Rerank

在上一篇教程中,我们了解了 Naive RAG 的基本原理和实现。它就像一个刚刚学会查找资料的新手,虽然能找到一些信息,但有时候找到的并不够精准,甚至会有一些无关的干扰。 今天,我们将介绍 Retrieve-and-Rerank RAG&…

【脚本】Linux磁盘目录挂载脚本(不分区)

以下是一个不带分区,直接挂载整个磁盘到指定目录的脚本。该脚本会检查磁盘是否已挂载,自动创建文件系统(可选),并配置开机自动挂载: #!/bin/bash# 磁盘直接挂载脚本(不分区) # 使用…

壁纸网站分享

壁纸网站链接: 1.Microsoft Design - Wallpapers:https://wallpapers.microsoft.design/?refwww.8kmm.com 2.哲风壁纸:https://haowallpaper.com/wallpaperForum 3.壁纸湖:https://bizihu.com/ 4.极简壁纸:https://bz…

XILINX FPGA如何做时序分析和时序优化?

时序分析和时序优化是FPGA开发流程中关键步骤,确保设计在目标时钟频率下正确运行,避免时序违例(如建立时间或保持时间不足)。以下以Xilinx Kintex-7系列FPGA为例,详细介绍时序分析和时序优化的方法、工具、流程及实用技…

linux screen轻松管理长时间运行的任务

以下是针对 Alpine Linux 环境下 screen 的安装与使用指南,结合迁移数据场景的具体操作步骤: 1. 安装 screen‌ 在 Alpine Linux 中需通过 apk 安装(非默认预装): apk add screen 验证安装: screen --…

VR制作公司业务范围

VR制作公司概念、能力与服务范围 虚拟现实(Virtual Reality, VR)技术,作为当代科技的前沿领域,通过计算机技术模拟出真实或虚构的世界环境,使用户能够沉浸其中并进行交互体验。VR制作公司,是这一领域的专业…

STM32之28BYJ-48步进电机驱动

目录 一、引言 二、28BYJ-48步进电机简介 2.1 基本特性 2.2 内部结构 2.3 工作模式 2.4 驱动原理 2.5 性能特点 2.6 驱动方案 2.7 使用注意事项 三、ULN2003驱动板简介 3.1 基本概述 3.2 电路结构 3.3 驱动原理 3.4 接口定义 3.5 使用注意事项 四、…

TDSQL如何查出某一列中的逗号数量

在 TDSQL 中,要统计某一列里逗号的数量,可借助字符串函数来实现。下面为你介绍具体的实现方法: sql SELECT your_column,LENGTH(your_column) - LENGTH(REPLACE(your_column, ,, )) AS comma_count FROM your_table;下面对这段 SQL 进行详细…

如何避免服务器出现故障情况?

服务器作为存储数据信息的重要网络设备,能够保护企业重要数据的安全性,但是随着网络攻击的不断拓展,各个行业中的服务器也会遭受到不同类型的网络攻击,严重的会导致服务器业务中断出现故障,给企业带来巨大的经济损失。…

C++ 优先级队列

一、引言 队列的特性是先进先出。优先级队列的本质是一个有序队列,根据成员的优先级,对队列中的成员进行排序。优先级队列默认是大顶堆,即堆顶元素最大 二、常用函数 empty()size()top()push()emplace()pop()swap() 三、代码示例 class …

学习笔记(27):线性回归基础与实战:从原理到应用的简易入门

线性回归:通过拟合线性方程(如 \(y w_1x_1 w_2x_2 b\))预测房价、销售额等连续变量,需掌握特征标准化、正则化(L1/L2)防止过拟合。应用场景:金融领域的股价预测、电商用户消费金额预估。 线性…

kubesphere安装openelb

kubesphere安装openelb 1.安装openelb 2.修改配置文件 1.命令直接修改 $ kubectl edit configmap kube-proxy -n kube-system ipvs:strictARP: truemode: "ipvs"重启kube-proxy组件 $ kubectl rollout restart daemonset kube-proxy -n kube-system 2.通过界面去修…

数据库10:MySQL的数据类型与约束和属性设置,数据模式

一.数据类型 整数类型(integer types) 数据类型字节有符号范围无符号范围说明tinyint1-128 ~ 1270 ~ 255非常小的整数smallint2-32,768 ~ 32,7670 ~ 65,535小整数mediumint3-8,388,608 ~ 8,388,6070 ~ 16,777,215中等整数int4-2,147,483,648 ~ 2,147,4…

uniapp项目中node_modules\sass\sass.dart.js的体积过大怎么处理

用Node-Sass替代(如果适用):虽然Dart Sass是Sass的主要实现之一,但有时它可能会比Node-Sass占用更多的空间。如果你不需要Dart Sass特有的功能,可以考虑切换到Node-Sass(注意Node-Sass已停止维护&#xff0…

界面组件DevExpress WPF中文教程:Grid - 如何获取节点?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…