__dict__方法 遇到這樣一個(gè)情況,要打印出一個(gè)對(duì)象的各種屬性。但是不同對(duì)象的屬性名都不一樣,結(jié)構(gòu)也不同,無(wú)法寫一個(gè)代碼來(lái)實(shí)現(xiàn)。然后我找到了__dict__,使用這個(gè)屬性,可以動(dòng)態(tài)獲取到對(duì)象的所有屬性,不包括公用屬性。
? 通過(guò)__dict__,就可以動(dòng)態(tài)的獲取到對(duì)象的全部屬性。獲得的是一個(gè)字典,屬性名是字典的key,屬性值是字典的value。從輸出看,私有屬性也可以獲得,只是不包括公有屬性。 然后,如果只想要屬性值的話,可以對(duì)字典再加工。復(fù)習(xí)一下字典的3個(gè)方法: dict.items() :用元祖來(lái)存放key和vlaue dict.keys() : 只包含key dict.values() : 只包含value 上面3個(gè)方法返回的都是一個(gè)可迭代對(duì)象,可以用for遍歷,但不是迭代器,不能用next方法。 然后用下面的方法打印
? 最后拆分一下打印的時(shí)候用到的方法 a = dict1.items() 這個(gè)是可迭代對(duì)象,可以用for遍歷 b = (%s:%s%item for item in a) 用for循環(huán)遍歷a,每一項(xiàng)是個(gè)元祖,把元祖轉(zhuǎn)成%s:%s的字符串形式。最外面的( )就是轉(zhuǎn)成一個(gè)迭代器。也可以用[ ],轉(zhuǎn)成列表。 c = ‘\n’.join(b) 最后用join()方法完成字符串的拼接 __str__方法 又發(fā)現(xiàn)一個(gè)更好用的方法,并且可以獲取到公有屬性了。__str__方法是在打印這個(gè)對(duì)象的時(shí)候,不再打印對(duì)象的內(nèi)存地址,而是打印__str__方法的返回值:
? 這里要注意,返回值必須是字符串,所以得傳一個(gè)數(shù)據(jù)類型 return .join(str(item) for item in (self.display,self.name,self.age,self.course,self.__salary)) 這個(gè)也可以這么寫 return %s %s %s %s %s%(self.display,self.name,self.age,self.course,self.__salary) 這么寫雖然好理解,但是前面的%s的數(shù)量必須和后面的變量一致,如果要加1個(gè)或減1個(gè)變量,前后都得改。 __str__方法可以完全自定義自己對(duì)象的輸出格式,既然是自定義的方法,那么還可以加上參數(shù)控制。但是調(diào)用的時(shí)候似乎并沒(méi)有地方填參數(shù)。 其實(shí)是在print調(diào)用對(duì)象的時(shí)候,系統(tǒng)已經(jīng)幫我們自動(dòng)將print指向了__str__方法,也就是說(shuō) print(t1) 其實(shí)執(zhí)行的是 print(t1.__str__()) ,這個(gè)時(shí)候我們就可以自己寫全,然后加上參數(shù)。
? 其實(shí)這里并沒(méi)不是打印了所有的屬性,而是我們自定義了打印內(nèi)容。但是自定義的位置是在類中的,這個(gè)位置是可以獲取到全部屬性的。 終極方法 其實(shí)就是把上面2個(gè)方法一起用。其實(shí)有上面2個(gè)方法應(yīng)該就可以了,不過(guò)既然都搞明白了,留個(gè)記錄也好。 先提一個(gè)點(diǎn),在定義了__str__方法后,雖然打印出來(lái)是字符串,但是在其他時(shí)候傳的值還是對(duì)象。如果想獲取就是打印的值而不是對(duì)象,那么還是用對(duì)象__str__() 來(lái)傳遞,下面就是最終的例子:
? 來(lái)源:https://www./content-1-351351.html |
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》