一、 引言
上節結合案例介紹了重寫__repr__方法的關注點,重寫__repr__方法的要點是要准確的輸出開發人員關注的信息,並便於開發人員使用相關信息。而__str__方法是為最終用戶返回類的相關信息,因此需要相關信息容易理解,更需要開發者在自定義類的過程中重寫__str__方法。
object類提供的__str__方法,只是簡單輸出模塊名、類名以及對象的ID信息,老猿認為實際上就是在__str__方法直接調用object類的__repr__方法,不過沒去研究代碼核實。不管怎樣,這個信息根本談不上用戶友好度,因此老猿建議對於重要的與客戶交互的類重寫類的__str__方法。
二、 重寫__str__方法
重寫__str__方法注意:
- __str__方法是實例方法,因此帶一個參數self,也只能帶這個參數;
- 輸出的信息盡可能容易讓客戶理解;
- 可以調用父類的__str__方法,也可以不調用,具體需要根據父類輸出信息的情況進行評估是否滿足客戶友好性。不過老猿建議最好調用,如果父類友好性不夠建議修改父類的__str__方法。
注意:如果類內未重寫__str__方法,但重寫了__repr__方法了,則調用__str__方法時Python會直接調用__repr__方法。
三、 例子
-
例子說明
本節繼續利用上節的Car類來說明__str__方法重寫,在類中重寫了__repr__方法和__str__方法,__repr__方法重寫是用的上節的內容,__str__方法重寫返回的信息包括:
1>證明調用了重寫方法的“In str:”提示;
2>使用中文描述的屬性名稱,以及對應值。
另外在信息查看時,特地調用直接查看對象和打印對象查看輸出,看看是否與上節的例子輸出不同。 -
案例代碼
1> 類定義
class Car():
def __init__(self,brand,type,color,weight,oilcostper100km): #構造方法
self.brand = brand
self.type = type
self.oilcostper100km = oilcostper100km
self.color = color
self.weight = weight
def __repr__(self):
s="In __repr__:\n <{} object at {:#016x}>\n".format(repr(self.__class__),id(self) )#使用類相關的信息輸出類名和實例ID
s+=super().__repr__() #直接調用object.__repr__方法輸出類信息和實例ID
#通過實例的self.__dict__獲取實例的詳細屬性信息,注意使用了repr函數去獲取字典信息字符串
s+='\n'+repr(self.__dict__)
return s
def __str__(self):
return "In __str__:\n 實例屬性:{} {},車身顏色{}、車重{}噸、百公里油耗{}升".\
format(self.brand,self.type,self.color,self.weight,self.oilcostper100km)
2>實例定義及查看信息()
car = Car('雪佛蘭','科帕奇','白色',1.8,10)
car #查看實例信息,此時會調用__repr__方法
print(car) #查看實例信息,此時會調用__str__方法,但沒有重寫__str__方法,效果會怎樣?
- 案例截圖
- 案例總結
通過上述案例說明:
1>重寫__str__方法后,使用print(對象)查看對象會觸發重寫方法的調用,其他觸發方式請見《第8.14節 Python類中內置方法的__str__詳解》,在此不再展開說明;
2>結合上節的案例一起,這2個案例驗證了上節所說明的“自定義類沒有重寫__str__方法的情況下,Python會直接調用__ repr __方法輸出,要輸出單獨的__str__信息需要重寫__str__方法”。
本節結合案例介紹了 __str__方法的重寫,可以看到通過重寫該方法如果輸出數據得當,相關信息有利於最終用戶理解。
老猿Python,跟老猿學Python! 博客地址:https://blog.csdn.net/LaoYuanPython