第8.16節 Python重寫自定義類的__str__方法


一、 引言
上節結合案例介紹了重寫__repr__方法的關注點,重寫__repr__方法的要點是要准確的輸出開發人員關注的信息,並便於開發人員使用相關信息。而__str__方法是為最終用戶返回類的相關信息,因此需要相關信息容易理解,更需要開發者在自定義類的過程中重寫__str__方法。
object類提供的__str__方法,只是簡單輸出模塊名、類名以及對象的ID信息,老猿認為實際上就是在__str__方法直接調用object類的__repr__方法,不過沒去研究代碼核實。不管怎樣,這個信息根本談不上用戶友好度,因此老猿建議對於重要的與客戶交互的類重寫類的__str__方法。
二、 重寫__str__方法
重寫__str__方法注意:

  1. __str__方法是實例方法,因此帶一個參數self,也只能帶這個參數;
  2. 輸出的信息盡可能容易讓客戶理解;
  3. 可以調用父類的__str__方法,也可以不調用,具體需要根據父類輸出信息的情況進行評估是否滿足客戶友好性。不過老猿建議最好調用,如果父類友好性不夠建議修改父類的__str__方法。
    注意:如果類內未重寫__str__方法,但重寫了__repr__方法了,則調用__str__方法時Python會直接調用__repr__方法。

三、 例子

  1. 例子說明
    本節繼續利用上節的Car類來說明__str__方法重寫,在類中重寫了__repr__方法和__str__方法,__repr__方法重寫是用的上節的內容,__str__方法重寫返回的信息包括:
    1>證明調用了重寫方法的“In str:”提示;
    2>使用中文描述的屬性名稱,以及對應值。
    另外在信息查看時,特地調用直接查看對象和打印對象查看輸出,看看是否與上節的例子輸出不同。

  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. 案例截圖
    在這里插入圖片描述
  2. 案例總結
    通過上述案例說明:
    1>重寫__str__方法后,使用print(對象)查看對象會觸發重寫方法的調用,其他觸發方式請見《第8.14節 Python類中內置方法的__str__詳解》,在此不再展開說明;
    2>結合上節的案例一起,這2個案例驗證了上節所說明的“自定義類沒有重寫__str__方法的情況下,Python會直接調用__ repr __方法輸出,要輸出單獨的__str__信息需要重寫__str__方法”。

本節結合案例介紹了 __str__方法的重寫,可以看到通過重寫該方法如果輸出數據得當,相關信息有利於最終用戶理解。

老猿Python,跟老猿學Python! 博客地址:https://blog.csdn.net/LaoYuanPython


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM