當(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í)行簡單的字符串