python 中的魔法方法:__str__ 和__repr__
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python的__str__和__repr__方法Python
- 詳解Python魔法函式,__init__,__str__,__del__Python函式
- Python類中__del__()、__call__()、__repr__()、__new__()、__hash__()方法Python
- python: 理解__str__Python
- python 魔法方法,屬性和迭代器Python
- python dict實現的魔法方法Python
- python進階-魔法方法Python
- python:類3——魔法方法Python
- Python魔法方法__getattr__和__getattribute__詳解Python
- Python基礎11(魔法方法)Python
- [ Python ] 常用運算子對應的魔法方法Python
- Python中的三個”黑魔法“與”騷操作“Python
- Python魔法方法是什麼?如何使用?Python
- Python的魔法函式Python函式
- Python的魔法函式系列 __getattrbute__和__getattr__Python函式
- python中模組和方法的查詢Python
- Python基礎-*args和**kwargs魔法變數Python變數
- Python中類的建立和使用方法Python
- Python中函式和方法的區別Python函式
- python魔法函式Python函式
- 魔法方法推開Python進階學習大門Python
- Python中的字串切割和拼接方法都有哪些?Python字串
- 『無為則無心』Python物件導向 — 59、魔法方法Python物件
- range方法在Python2和Python3中的不同Python
- 04 #### `__str__` , 輸出物件物件
- Python中列表的方法Python
- python類中的方法Python
- Python: 函式引數魔法Python函式
- python黑魔法---迭代器(iterator)Python
- Python “黑魔法” 之 Meta ClassesPython
- Python 黑魔法 --- 描述器(descriptor)Python
- Python “黑魔法” 之 Generator CoroutinesPython
- Python中私有變數和私有方法Python變數
- ReactiveCocoa 中奇妙無比的“巨集”魔法React
- ReactiveCocoa 中 奇妙無比的 “巨集” 魔法React
- Python中建立DataFrame的方法Python
- Python中sort()方法的使用Python
- Python中列表常用的方法Python