深入對比 Python 中的 `__repr__` 與 `__str__`:選擇正確的對象表示方法

文章目錄

    • 核心概念對比
      • 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辦公軟件…