在閱讀高手寫(xiě)的代碼時(shí),有很多簡(jiǎn)寫(xiě)的形式,如果沒(méi)有見(jiàn)過(guò)還真的看不太懂是什么意思,其中一個(gè)比較常用的就是getattr()用來(lái)調(diào)用一個(gè)類中的變量或者方法,相關(guān)聯(lián)的hasattr()、getattr()、setattr()函數(shù)的使用也一并學(xué)習(xí)了一下;
1. hasattr(object, name)
判斷object對(duì)象中是否存在name屬性,當(dāng)然對(duì)于python的對(duì)象而言,屬性包含變量和方法;有則返回True,沒(méi)有則返回False;需要注意的是name參數(shù)是string類型,所以不管是要判斷變量還是方法,其名稱都以字符串形式傳參;getattr和setattr也同樣;
2. getattr(object, name[, default])
獲取object對(duì)象的屬性的值,如果存在則返回屬性值,如果不存在分為兩種情況,一種是沒(méi)有default參數(shù)時(shí),會(huì)直接報(bào)錯(cuò);給定了default參數(shù),若對(duì)象本身沒(méi)有name屬性,則會(huì)返回給定的default值;如果給定的屬性name是對(duì)象的方法,則返回的是函數(shù)對(duì)象,需要調(diào)用函數(shù)對(duì)象來(lái)獲得函數(shù)的返回值;調(diào)用的話就是函數(shù)對(duì)象后面加括號(hào),如func之于func();
另外還需要注意,如果給定的方法func()是實(shí)例函數(shù),則不能寫(xiě)getattr(A, ‘func’)(),因?yàn)閒un()是實(shí)例函數(shù)的話,是不能用A類對(duì)象來(lái)調(diào)用的,應(yīng)該寫(xiě)成getattr(A(), ‘func’)();實(shí)例函數(shù)和類函數(shù)的區(qū)別可以簡(jiǎn)單的理解一下,實(shí)例函數(shù)定義時(shí),直接def func(self):,這樣定義的函數(shù)只能是將類實(shí)例化后,用類的實(shí)例化對(duì)象來(lái)調(diào)用;而類函數(shù)定義時(shí),需要用@classmethod來(lái)裝飾,函數(shù)默認(rèn)的參數(shù)一般是cls,類函數(shù)可以通過(guò)類對(duì)象來(lái)直接調(diào)用,而不需要對(duì)類進(jìn)行實(shí)例化;
3. setattr(object, name, value)
給object對(duì)象的name屬性賦值value,如果對(duì)象原本存在給定的屬性name,則setattr會(huì)更改屬性的值為給定的value;如果對(duì)象原本不存在屬性name,setattr會(huì)在對(duì)象中創(chuàng)建屬性,并賦值為給定的value;
一般先判斷對(duì)象中是否存在某屬性,如果存在則返回;如果不存在,則給對(duì)象增加屬性并賦值;很簡(jiǎn)單的if-else判斷: