教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

python 魔法方法:__str__ 和__repr__詳細(xì)介紹

更新時(shí)間:2019年09月12日16時(shí)17分 來(lái)源:傳智播客 瀏覽次數(shù):

下面我們介紹python 中的魔法方法__str__ 和__repr__

1. 引言

在學(xué)習(xí)面向?qū)ο蟮臅r(shí)候,我們知道在 python 中有一類特殊的方法,叫做魔法方法,這種方法的特點(diǎn)如下:

(1)方法定義的時(shí)候以兩個(gè)下劃線開(kāi)頭和兩個(gè)下劃線結(jié)尾:如__init__、__str__和__repr__

(2)這類方法一般不需要我們手動(dòng)調(diào)用,在滿足某個(gè)條件的時(shí)候會(huì)自動(dòng)調(diào)用,這個(gè)滿足的條件我們可以成為調(diào)用時(shí)機(jī)。

在Python 中有兩個(gè)魔法方法都是用來(lái)描述對(duì)象信息的,__str__和__repr__,那為什么要定義兩個(gè)這樣的方法呢,其實(shí)是他們?cè)O(shè)計(jì)的目的是不一樣的:

(1) __repr__的目標(biāo)是準(zhǔn)確性,或者說(shuō),__repr__的結(jié)果是讓解釋器用的。

(2)__str__的目標(biāo)是可讀性,或者說(shuō),__str__的結(jié)果是讓人看的。


python魔法方法

2. 分析

那下邊,我們?cè)敿?xì)的來(lái)看一下,他們的用法: 在不重寫__str__ 和 __repr__的情況下,打印對(duì)象的輸出結(jié)果不太友好,是對(duì)象的內(nèi)存地址,即 id 的結(jié)果。

# 定義 Person 類

class Person(object):

def __init__(self, name):

self.name = name

p = Person("isaac")

以下為測(cè)試輸出的結(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é)果,此時(shí)我們重寫__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")

以下為測(cè)試結(jié)果:

>>> print(p)

__str__ 方法 isaac

>>> str(p)

'__str__ 方法 isaac'

>>> f"{p}"

'__str__ 方法 isaac'

>>> p.__str__()

'__str__ 方法 isaac'

>>> p

此時(shí)我們發(fā)現(xiàn)在使用 print 打印對(duì)象、對(duì)象的格式化輸出以及調(diào)用 str 方法,調(diào)用的都是__str__方法。但在交互環(huán)境下,直接輸出 對(duì)象的時(shí)候,沒(méi)有調(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")

此時(shí),我們?cè)賮?lái)看輸出的結(jié)果,

>>> p

__repr__ 方法isaac

>>> p.__repr__()

'__repr__ 方法isaac'

>>> print(p)

__str__ 方法 isaac

通過(guò)簡(jiǎn)單的對(duì)比,我們發(fā)現(xiàn),在交互環(huán)境下,直接輸出對(duì)象,調(diào)用的__repr__ 方法。 另外還需要注意的是,如果將對(duì)象放在容器中進(jìn)行輸出,調(diào)用的是__repr__ 方法。

>>> [p]

[__repr__ 方法 isaac]

>>> (p)

__repr__ 方法 isaac

>>> {"1":p}

{'1': __repr__ 方法 isaac}

>>> print([p])

[__repr__ 方法 isaac]

3. 總結(jié)

Python 中的__str__ 和 __repr__方法都是用來(lái)顯示的,即描述對(duì)象信息的。

 1. __str__的目標(biāo)是可讀性,或者說(shuō),__str__的結(jié)果是讓人看的。主要用來(lái)打印,即 print 操作,

 2. __repr__的目標(biāo)是準(zhǔn)確性,或者說(shuō),__repr__的結(jié)果是讓解釋器用的。__repr__用于交互模式下提示回應(yīng),

3. 如果沒(méi)有重寫__str__方法,但重寫了__repr__方法時(shí),所有調(diào)用__str__的時(shí)機(jī)都會(huì)調(diào)用__repr__方法。


推薦了解:
大數(shù)據(jù)培訓(xùn)課程
python+人工智能課程

0 分享到:
和我們?cè)诰€交談!