python 中的魔法方法:__str__ 和__repr__

傳智黑馬發表於2019-12-24

1. 引言

在學習物件導向的時候,我們知道在 python 中有一類特殊的方法,叫做魔法方法,這種方法的特點如下: 1. 方法定義的時候以兩個下劃線開頭和兩個下劃線結尾:如 __init____str____repr__ 2. 這類方法一般不需要我們手動呼叫,在滿足某個條件的時候會自動呼叫,這個滿足的條件我們可以成為呼叫時機。2020學習黑馬程式設計師python教程:

在Python 中有兩個魔法方法都是用來描述物件資訊的, __str____repr__,那為什麼要定義兩個這樣的方法呢,其實是他們設計的目的是不一樣的: 1.  __repr__的目標是準確性,或者說, __repr__的結果是讓直譯器用的。 2.  __str__的目標是可讀性,或者說, __str__的結果是讓人看的。

2. 分析

那下邊,我們詳細的來看一下,他們的用法: 在不重寫 __str__ 和  __repr__的情況下,列印物件的輸出結果不太友好,是物件的記憶體地址,即 id 的結果。

# 定義 Person 類class Person(object):def __init__(self, name):self.name = namep = Person("isaac")

以下為測試輸出的結果:

>>> print(p)<__main__.Person object at 0x10f29b940>>>> p<__main__.Person object at 0x10f29b940>>>> p.__str__()'<__main__.Person object at 0x10f29b940>'>>> p.__repr__()'<__main__.Person object at 0x10f29b940>'

這樣的輸出結果,並不是我們想要的結果,此時我們重寫 __str__ 和  __repr__方法。

2.1 重寫 __str__ 方法

# 定義 Person 類class Person(object):def __init__(self, name):self.name = namedef __str__(self):return "__str__ 方法 " + self.namep = Person("isaac")

以下為測試結果:

>>> print(p)__str__ 方法 isaac>>> str(p)'__str__ 方法 isaac'>>> f"{p}"'__str__ 方法 isaac'>>> p.__str__()'__str__ 方法 isaac'>>> p<demo.Person object at 0x10e0e3588>

此時我們發現在使用 print 列印物件、物件的格式化輸出以及呼叫 str 方法,呼叫的都是 __str__方法。但在互動環境下,直接輸出 物件的時候,沒有呼叫 __str__ 方法,輸出的結果仍然是 id 的結果。

2.2 重寫 __repr__ 方法

# 定義 Person 類class Person(object):def __init__(self, name):self.name = namedef __str__(self):return "__str__ 方法 " + self.namedef __repr__(self):return "__repr__ 方法 " + self.namep = Person("isaac")

此時,我們再來看輸出的結果,

>>> p__repr__ 方法isaac>>> p.__repr__()'__repr__ 方法isaac'>>> print(p)__str__ 方法 isaac

透過簡單的對比,我們發現,在互動環境下,直接輸出物件,呼叫的 __repr__ 方法。 另外還需要注意的是,如果將物件放在容器中進行輸出,呼叫的是 __repr__ 方法。

>>> [p][__repr__ 方法 isaac]>>> (p)__repr__ 方法 isaac>>> {"1":p}{'1': __repr__ 方法 isaac}>>> print([p])[__repr__ 方法 isaac]

3. 總結

Python 中的 __str__ 和  __repr__方法都是用來顯示的,即描述物件資訊的。 1.  __str__的目標是可讀性,或者說, __str__的結果是讓人看的。主要用來列印,即 print 操作, 2.  __repr__的目標是準確性,或者說, __repr__的結果是讓直譯器用的。 __repr__用於互動模式下提示回應, 3. 如果沒有重寫 __str__方法,但重寫了 __repr__方法時,所有呼叫 __str__的時機都會呼叫 __repr__方法。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69915785/viewspace-2670333/,如需轉載,請註明出處,否則將追究法律責任。

相關文章