有時(shí)候我們會(huì)碰到這樣的需求,需要執(zhí)行對(duì)象的某個(gè)方法,或是需要對(duì)對(duì)象的某個(gè)字段賦值,而方法名或是字段名在編碼代碼時(shí)并不能確定,需要通過參數(shù)傳遞字符串的形式輸入。舉個(gè)具體的例子:當(dāng)我們需要實(shí)現(xiàn)一個(gè)通用的DBM框架時(shí),可能需要對(duì)數(shù)據(jù)對(duì)象的字段賦值,但我們無法預(yù)知用到這個(gè)框架的數(shù)據(jù)對(duì)象都有些什么字段,換言之,我們?cè)趯懣蚣艿臅r(shí)候需要通過某種機(jī)制訪問未知的屬性。
這個(gè)機(jī)制被稱為反射(反過來讓對(duì)象告訴我們他是什么),或是自省(讓對(duì)象自己告訴我們他是什么,好吧我承認(rèn)括號(hào)里是我瞎掰的--#),用于實(shí)現(xiàn)在運(yùn)行時(shí)獲取未知對(duì)象的信息。反射是個(gè)很嚇唬人的名詞,聽起來高深莫測(cè),在一般的編程語言里反射相對(duì)其他概念來說稍顯復(fù)雜,一般來說都是作為高級(jí)主題來講;但在Python中反射非常簡單,用起來幾乎感覺不到與其他的代碼有區(qū)別,使用反射獲取到的函數(shù)和方法可以像平常一樣加上括號(hào)直接調(diào)用,獲取到類后可以直接構(gòu)造實(shí)例;不過獲取到的字段不能直接賦值,因?yàn)槟玫降钠鋵?shí)是另一個(gè)指向同一個(gè)地方的引用,賦值只能改變當(dāng)前的這個(gè)引用而已。
1.訪問對(duì)象的屬性
以下列出了幾個(gè)內(nèi)建方法,可以用來檢查或是訪問對(duì)象的屬性。這些方法可以用于任意對(duì)象而不僅僅是例子中的Cat實(shí)例對(duì)象;Python中一切都是對(duì)象。
cat=Cat('kitty')
printcat.name#訪問實(shí)例屬性
cat.sayHi()#調(diào)用實(shí)例方法
printdir(cat)#獲取實(shí)例的屬性名,以列表形式返回
ifhasattr(cat,'name'):#檢查實(shí)例是否有這個(gè)屬性
setattr(cat,'name','tiger')#sameas:a.name='tiger'
printgetattr(cat,'name')#sameas:printa.name
getattr(cat,'sayHi')()#sameas:cat.sayHi()
dir([obj]):
調(diào)用這個(gè)方法將返回包含obj大多數(shù)屬性名的列表(會(huì)有一些特殊的屬性不包含在內(nèi))。obj的默認(rèn)值是當(dāng)前的模塊對(duì)象。
hasattr(obj,attr):
這個(gè)方法用于檢查obj是否有一個(gè)名為attr的值的屬性,返回一個(gè)布爾值。
getattr(obj,attr):
調(diào)用這個(gè)方法將返回obj中名為attr值的屬性的值,例如如果attr為'bar',則返回obj.bar。
setattr(obj,attr,val):
調(diào)用這個(gè)方法將給obj的名為attr的值的屬性賦值為val。例如如果attr為'bar',則相當(dāng)于obj.bar=val。
以上內(nèi)容為大家介紹了python之執(zhí)行對(duì)象,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.madgrindclothing.com/