介紹
在這篇文章中,您將了解到 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)
輸出為:
Outputmydate1 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
上面的範例代碼從 mydate1
的 repr()
字符串創建了 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))
輸出為:
OutputThe 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