更新時間:2019年09月12日16時17分 來源:傳智播客 瀏覽次數(shù):
下面我們介紹python 中的魔法方法__str__ 和__repr__
1. 引言
在學(xué)習(xí)面向?qū)ο蟮臅r候,我們知道在 python 中有一類特殊的方法,叫做魔法方法,這種方法的特點如下:
(1)方法定義的時候以兩個下劃線開頭和兩個下劃線結(jié)尾:如__init__、__str__和__repr__
(2)這類方法一般不需要我們手動調(diào)用,在滿足某個條件的時候會自動調(diào)用,這個滿足的條件我們可以成為調(diào)用時機。
在Python 中有兩個魔法方法都是用來描述對象信息的,__str__和__repr__,那為什么要定義兩個這樣的方法呢,其實是他們設(shè)計的目的是不一樣的:
(1) __repr__的目標(biāo)是準(zhǔn)確性,或者說,__repr__的結(jié)果是讓解釋器用的。
(2)__str__的目標(biāo)是可讀性,或者說,__str__的結(jié)果是讓人看的。
2. 分析
那下邊,我們詳細的來看一下,他們的用法: 在不重寫__str__ 和 __repr__的情況下,打印對象的輸出結(jié)果不太友好,是對象的內(nèi)存地址,即 id 的結(jié)果。
# 定義 Person 類
class Person(object):
def __init__(self, name):
self.name = name
p = Person("isaac")
以下為測試輸出的結(jié)果:
>>> 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>'
這樣的輸出結(jié)果,并不是我們想要的結(jié)果,此時我們重寫__str__ 和 __repr__方法。
2.1 重寫__str__ 方法
# 定義 Person 類
class Person(object):
def __init__(self, name):
self.name = name
def __str__(self):
return "__str__ 方法 " + self.name
p = Person("isaac")
以下為測試結(jié)果:
>>> print(p)
__str__ 方法 isaac
>>> str(p)
'__str__ 方法 isaac'
>>> f"{p}"
'__str__ 方法 isaac'
>>> p.__str__()
'__str__ 方法 isaac'
>>> p
此時我們發(fā)現(xiàn)在使用 print 打印對象、對象的格式化輸出以及調(diào)用 str 方法,調(diào)用的都是__str__方法。但在交互環(huán)境下,直接輸出 對象的時候,沒有調(diào)用__str__ 方法,輸出的結(jié)果仍然是 id 的結(jié)果。
2.2 重寫__repr__ 方法
# 定義 Person 類
class Person(object):
def __init__(self, name):
self.name = name
def __str__(self):
return "__str__ 方法 " + self.name
def __repr__(self):
return "__repr__ 方法 " + self.name
p = Person("isaac")
此時,我們再來看輸出的結(jié)果,
>>> p
__repr__ 方法isaac
>>> p.__repr__()
'__repr__ 方法isaac'
>>> print(p)
__str__ 方法 isaac
通過簡單的對比,我們發(fā)現(xiàn),在交互環(huán)境下,直接輸出對象,調(diào)用的__repr__ 方法。 另外還需要注意的是,如果將對象放在容器中進行輸出,調(diào)用的是__repr__ 方法。
>>> [p]
[__repr__ 方法 isaac]
>>> (p)
__repr__ 方法 isaac
>>> {"1":p}
{'1': __repr__ 方法 isaac}
>>> print([p])
[__repr__ 方法 isaac]
3. 總結(jié)
Python 中的__str__ 和 __repr__方法都是用來顯示的,即描述對象信息的。
1. __str__的目標(biāo)是可讀性,或者說,__str__的結(jié)果是讓人看的。主要用來打印,即 print 操作,
2. __repr__的目標(biāo)是準(zhǔn)確性,或者說,__repr__的結(jié)果是讓解釋器用的。__repr__用于交互模式下提示回應(yīng),
3. 如果沒有重寫__str__方法,但重寫了__repr__方法時,所有調(diào)用__str__的時機都會調(diào)用__repr__方法。
推薦了解:
大數(shù)據(jù)培訓(xùn)課程
python+人工智能課程