Python列印對象的全部屬性
__dict__方法
遇到這樣一個情況,要列印出一個對象的各種屬性。但是不同對象的屬性名都不一樣,結構也不同,無法寫一個代碼來實現。然後我找到了__dict__,使用這個屬性,可以動態獲取到對象的所有屬性,不包括公用屬性。
通過__dict__,就可以動態的獲取到對象的全部屬性。獲得的是一個字典,屬性名是字典的key,屬性值是字典的value。從輸出看,私有屬性也可以獲得,只是不包括公有屬性。
然後,如果只想要屬性值的話,可以對字典再加工。複習一下字典的3個方法:
dict.items() :用元祖來存放key和vlaue
dict.keys() : 只包含key
dict.values() : 只包含value
上面3個方法返回的都是一個可迭代對象,可以用for遍歷,但不是迭代器,不能用next方法。
然後用下面的方法列印
最後拆分一下列印的時候用到的方法
a = dict1.items() 這個是可迭代對象,可以用for遍歷
b = (%s:%s%item for item in a) 用for循環遍歷a,每一項是個元祖,把元祖轉成%s:%s的字元串形式。最外面的( )就是轉成一個迭代器。也可以用[ ],轉成列表。
c = 『\n』.join(b) 最後用join()方法完成字元串的拼接
__str__方法
又發現一個更好用的方法,並且可以獲取到公有屬性了。__str__方法是在列印這個對象的時候,不再列印對象的內存地址,而是列印__str__方法的返回值:
這裡要注意,返回值必須是字元串,所以得傳一個數據類型
return .join(str(item) for item in (self.display,self.name,self.age,self.course,self.__salary)) 這個也可以這麼寫
return %s %s %s %s %s%(self.display,self.name,self.age,self.course,self.__salary) 這麼寫雖然好理解,但是前面的%s的數量必須和後面的變數一致,如果要加1個或減1個變數,前後都得改。
__str__方法可以完全自定義自己對象的輸出格式,既然是自定義的方法,那麼還可以加上參數控制。但是調用的時候似乎並沒有地方填參數。
其實是在print調用對象的時候,系統已經幫我們自動將print指向了__str__方法,也就是說 print(t1) 其實執行的是 print(t1.__str__()) ,這個時候我們就可以自己寫全,然後加上參數。
其實這裡並沒不是列印了所有的屬性,而是我們自定義了列印內容。但是自定義的位置是在類中的,這個位置是可以獲取到全部屬性的。
終極方法
其實就是把上面2個方法一起用。其實有上面2個方法應該就可以了,不過既然都搞明白了,留個記錄也好。
先提一個點,在定義了__str__方法後,雖然列印出來是字元串,但是在其他時候傳的值還是對象。如果想獲取就是列印的值而不是對象,那麼還是用對象__str__()? 來傳遞,下面就是最終的例子:
※到處是map、flatMap,啥意思?
※分散式服務介面請求的順序性
TAG:千鋒JAVA開發學院 |