如何在Python中使用__str__()和__repr__()方法

介紹

在這篇文章中,您將了解到 Python 數據模型中定義的特殊方法 __str__()__repr__()__str__()__repr__() 方法可以通過記錄或打印有關對象的有用信息來幫助調試 Python 代碼。Python

特殊方法以雙下劃線開頭和結尾,非正式地稱為 dunder 方法。 Dunder 方法是 Python 內置運算符和函數的基礎方法。 應該避免直接調用 dunder 方法,而是在您的類中實現 dunder 方法,然後使用調用它們的內置函數,例如 str()repr()

__str__()__repr__() 有什麼區別?

__str__() 方法返回對象的人類可讀或非正式字符串表示。此方法由內置的print()str()format()函數調用。如果您未為類定義__str__()方法,則內置對象實現將調用__repr__()方法。

__repr__() 方法返回對象的更多信息豐富或官方字符串表示。此方法由內置的repr()函數調用。如果可能,返回的字符串應該是一個有效的Python表達式,可以用來重新創建該對象。在所有情況下,字符串都應該是有信息量且明確的。

通常,__str__()字符串適用於用戶,而__repr__()字符串適用於開發人員。

使用內置類的__str__()__repr__()示例

本節中的示例直接調用__str__()__repr__()方法,僅供演示目的使用。

datetime.datetime類是一個內置的Python類,具有__str__()__repr__()方法的默認實現。

以下是一個範例代碼,顯示了對於 datetime.datetime 物件,__str__()__repr__() 方法的默認實現所返回的字符串:

import datetime

mydate = datetime.datetime.now()

print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))

print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))

輸出為:

Output
__str__() string: 2023-01-27 09:50:37.429078 str() string: 2023-01-27 09:50:37.429078 __repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078) repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)

該輸出顯示了 str() 函數調用 __str__() 並返回人類可讀的字符串,而 repr() 函數調用 __repr__() 並返回更多信息的字符串,可以用來重新創建該物件。實際上,您可以使用 repr() 函數與 eval() 函數從字符串中創建一個新的物件:

import datetime

mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))

print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))

print("the values of the objects are equal: ", mydate1==mydate2)

輸出為:

Output
mydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) the values of the objects are equal: True

上面的範例代碼從 mydate1repr() 字符串創建了 mydate2 物件,然後驗證了兩個物件的值是否相等。

__str__()__repr__() 使用新類別的示例

當您創建一個類別時,您應該至少實現 ___repr__() 方法,以便在內置函數使用 __repr__() 時返回有用的信息。

以下類別未實現 __str__()__repr()__ 方法:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

當您使用 str()repr() 時的輸出為:

Output
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>

前面的示例顯示,對象的__repr()__的默認實現僅返回一個字符串,其中只包含類和十六進制格式的對象id,這並不是非常有用。請注意,str()repr()返回相同的值,因為當__str__()未實現時,str()調用__repr__()

更新Ocean類,實現__str__()__repr__()方法:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age
    
    def __str__(self):
        return f'The creature type is {self.name} and the age is {self.age}'

    def __repr__(self):
        return f'Ocean(\'{self.name}\', {self.age})'

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

輸出為:

Output
The creature type is Jellyfish and the age is 5 Ocean('Jellyfish', 5)

前面示例中__str__()的實現返回一個易於閱讀的字符串,為用戶提供了對象的相關細節。__repr__()的實現返回一個字符串,該字符串是一個有效的Python表達式,可用於重新創建對象:Ocean('Jellyfish', 5)。示例使用f-string格式化,但您可以使用Python支持的任何格式來格式化字符串。

結論

在這篇文章中,您探討了__str__()__repr__()方法之間的區別,並在類中實現了這些特殊方法,以便您不需要直接調用它們。通過我們的Python字符串教程來更深入地了解如何在Python中處理字符串。

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions