溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Python中的__str__()和__repr__()

發布時間:2021-11-22 11:39:44 來源:億速云 閱讀:165 作者:iii 欄目:大數據
# 怎么使用Python中的__str__()和__repr__()

在Python中,`__str__()`和`__repr__()`是兩個重要的魔術方法(magic methods),用于定義對象的字符串表示形式。雖然它們的功能相似,但使用場景和目的有所不同。本文將詳細介紹它們的區別、用法以及如何在實際開發中正確實現這兩個方法。

## 1. `__str__()`方法

`__str__()`方法用于返回對象的“非正式”或可讀性好的字符串表示,通常面向終端用戶。當你使用`print()`函數或`str()`函數時,Python會調用該方法。

### 示例代碼
```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

p = Person("Alice", 30)
print(p)  # 輸出:Person(name=Alice, age=30)

特點

  • 目標是可讀性。
  • 通常用于日志、用戶界面等場景。
  • 如果沒有定義__str__(),Python會調用__repr__()作為備用。

2. __repr__()方法

__repr__()方法返回對象的“正式”字符串表示,通常是合法的Python表達式,能夠用于重新創建該對象。它主要面向開發者,常用于調試。

示例代碼

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

p = Person("Alice", 30)
print(repr(p))  # 輸出:Person(name='Alice', age=30)

特點

  • 目標是明確性和無歧義。
  • 理想情況下,eval(repr(obj))應能重新創建對象。
  • 在交互式環境中直接輸入對象名時,會調用__repr__()。

3. 兩者的區別

特性 __str__() __repr__()
目標用戶 終端用戶 開發者
用途 可讀性輸出 調試、重新創建對象
調用場景 print()、str() repr()、交互式環境
默認行為 若未定義,調用__repr__() 若未定義,返回內存地址信息

4. 最佳實踐

  1. 始終實現__repr__()
    因為它能提供對象的明確信息,對調試至關重要。

  2. 按需實現__str__()
    如果需要一個用戶友好的輸出,再額外實現該方法。

  3. 保持一致性
    __repr__()的輸出應盡量滿足eval(repr(obj)) == obj。

完整示例

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __repr__(self):
        return f"Point({self.x}, {self.y})"
    
    def __str__(self):
        return f"({self.x}, {self.y})"

p = Point(1, 2)
print(str(p))    # 輸出:(1, 2)
print(repr(p))   # 輸出:Point(1, 2)

5. 總結

  • __str__()用于用戶友好的輸出,__repr__()用于開發者調試。
  • 優先實現__repr__(),再根據需要實現__str__()。
  • 通過合理使用這兩個方法,可以顯著提升代碼的可讀性和可維護性。

掌握這兩個魔術方法的使用,能夠讓你的Python類更加專業和易用! “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女