很多時候我們自己編寫乙個類,在將它的例項在終端上列印或檢視的時候,我們往往會看到乙個不太滿意的結果。所以,我們可能會手動列印物件的一些屬性或者是在類裡自己實現乙個方法來返回我們需要的資訊。
class car:
def __init__(self, color):
self.color = color
def __str__(self):
return f'a car'
my_car = car('red')
print(my_car)
my_car
str(my_car)
'{}'.format(my_car)
輸出結果
a red car
<__main__.car object at 0x000001bedbddec18>
'a red car'
'a red car'
有了 str 這個方法,你就不用手動去列印物件的一些資訊或者新增額外的方法去達到目的。類到字串的轉化使用 str 這種 pythonic 的方式實現即可。
__repr__的工作方式與__str__類似,但是它被呼叫的時機不同。
class car:
def __init__(self, color):
self.color = color
def __str__(self):
return '__str__ for car'
def __repr__(self):
return '__repr__ for car'
my_car = car('red')
print(my_car)
'{}'.format(my_car)
my_car
輸出結果
__str__ for car
'__str__ for car'
__repr__ for car
從這個操作我們可以看出什麼時候呼叫str什麼時候呼叫repr。
另外,列表以及字典等容器總是會使用 repr 方法。即使你顯式的呼叫 str 方法,也是如此。
import datetime
today = datetime.date.today()
today
str(today)
repr(today)
輸出結果
datetime.date(2020, 4, 22)
'2020-04-22'
'datetime.date(2020, 4, 22)'
因此,我們有個初步的答案。
__str__的返回結果可讀性強。__str__的意義是得到便於人們閱讀的資訊。
__repr__的返回結果應更準確。__repr__存在的目的在於除錯,便於開發者使用,將__repr__返回的方式直接複製到命令列上,是可以直接執行的。
由上我們可以總結出使用__str__和__repr__方法定義類到字串的轉化方式,而不需要手動列印某些屬性或是新增額外的方法。__str__的返回結果在於強可讀性,而__repr__的返回結果在於準確性。我們至少需要新增乙個__repr__方法來保證類到字串的自定義轉化的有效性,__str__是可選的。因為預設情況下,在需要卻找不到__str__方法的時候,會自動呼叫 __repr__方法。
魔法方法中的 str 和 repr
str self class test1 def str self return i am str return即返回什麼列印什麼 a str 直接例項化物件名,會列印其位址 main.test1 object at 0x0000025e39348088 print a str 若print,則會列...
物件導向 魔法方法 str
class hero object 定義了乙個英雄類,可以移動和攻擊 def init self,name,skill,hp,atk,armor init 方法,用來做變數初始化 或 賦值 操作 英雄名 self.name name 例項變數 技能 self.skill skill 生命值 self...
Python魔法方法 基本的魔法方法
new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...