python反射機(jī)制

當(dāng)我們有多個(gè)選項(xiàng),根據(jù)不同值調(diào)用不同對象時(shí),
不想寫很多if—else,就用反射,達(dá)到了動態(tài)訪問、不寫死的效果,高內(nèi)聚、松耦合

反射涉及四個(gè)函數(shù):
hasattr: 通過 “字符串” 判斷對象的屬性或方法是否存在
getattr: 通過 “字符串” 獲取對象的屬性或方法
setattr: 通過 “字符串” 設(shè)置對象的屬性或方法
delattr: 通過 “字符串” 刪除對象的屬性或方法

使用內(nèi)置函數(shù):
getattr(object, name)

object:是一個(gè)對象或者模塊
name:一個(gè)字符串,代表了對象名稱

getattr(commons, 'foobar')
讓程序去commons這個(gè)模塊里,尋找一個(gè)名字叫'foobar'的成員,過程相當(dāng)于把一個(gè)字符串變成一個(gè)函數(shù)名的過程

python反射本質(zhì)就是基于字符串的事件驅(qū)動,利用字符串的形式去對象(模塊)中操作(查找/獲取/刪除/添加)成員

hasattr內(nèi)置函數(shù),用于判斷commons中是否具有某個(gè)成員,防止非法輸入錯誤

if hasattr(commons,'foobar'):
    func = getattr(commons,'foobar')
    func()
    
    
# setattr
# 為foo_obj設(shè)置一個(gè)屬性z,值為30
setattr(foo_obj, 'z', 30)
print(hasattr(foo_obj, 'z'))  # True
 
# delattr
delattr(foo_obj, 'x')
print(hasattr(foo_obj, 'x'))  # False

動態(tài)導(dǎo)入模塊

obj = __import__(modules)

modules是字符串

obj = __import__("lib." + modules, fromlist=True)
默認(rèn)只讀最開頭的圓點(diǎn)左邊的目錄,加上fromlist即可以讀全部

如果輸入了不存在的模塊名,只能通過異常處理來解決。

exec和eval,也能執(zhí)行簡單的字符串

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、前言 deff1(): print("f1是這個(gè)函數(shù)的名字!") s ="f1"print("%s是個(gè)字符...
    公子小白123閱讀 316評論 0 3
  • 一、前言 在上面的代碼中,我們必須區(qū)分兩個(gè)概念,f1和“f1"。前者是函數(shù)f1的函數(shù)名,后者只是一個(gè)叫”f1“的字...
    aport閱讀 1,729評論 0 7
  • 轉(zhuǎn)自:http://www.cnblogs.com/feixuelove1009/p/5576206.html,只...
    think_lonely閱讀 2,582評論 1 2
  • 前言 def s1(): print("s1是這個(gè)函數(shù)的名字!") s = "s1" print("%s是個(gè)字符串...
    lijun_m閱讀 1,355評論 0 2
  • python根據(jù)字符串動態(tài)加載模塊和類 python作為一種動態(tài)解釋型語言,在實(shí)現(xiàn)各種框架方面具有很大的靈活性。 ...
    Jason_c8d4閱讀 639評論 0 0

友情鏈接更多精彩內(nèi)容