反射說簡單點 --> 就是利用字符串的形式去對象(模塊)中操做(尋找/檢查/設置/刪除)成員。python
class Black_Medium: feture = "Ugly" def __init__(self,name,addr): self.name = name self.addr = addr def sell_hourse(self): print("[%s]正在賣房子"%self.name) def rent_hourse(self): print("[%s]正在租房子"%self.name) b1 = Black_Medium("萬城置地","天露園") print(hasattr(b1,"name"))#尋找-----判斷object中有沒有一個name字符串對應的方法或屬性(就是看b1能不能調用name的方法或屬性) print(getattr(b1,"rent_hourse","沒有這個屬性"))#檢查-----至關於b1.rent_hourse,沒有默認參數找不到會報錯 setattr(b1,"alex","18")#設置-----至關於b1.alex = 18 delattr(b1,"addr")#刪除-----至關於del b1.addr print(b1.__dict__)
導入其餘模塊,利用反射查找該模塊是否存在某個方法程序員
def test(): print('from the test')
""" 程序目錄: module_test.py index.py 當前文件: index.py """ import module_test as obj #obj.test() print(hasattr(obj,'test')) getattr(obj,'test')()
爲何用反射之反射的好處服務器
好處一:實現可插拔機制ide
有倆程序員,一個lili,一個是egon,lili在寫程序的時候須要用到egon所寫的類,可是egon去跟女友度蜜月去了,尚未完成他寫的類,lili想到了反射,使用了反射機制lili能夠繼續完成本身的代碼,等egon度蜜月回來後再繼續完成類的定義而且去實現lili想要的功能。spa
總之反射的好處就是,能夠事先定義好接口,接口只有在被完成後纔會真正執行,這實現了即插即用,這實際上是一種‘後期綁定’,什麼意思?即你能夠事先把主要的邏輯寫好(只定義接口),而後後期再去實現接口的功能3d
class FtpClient: 'ftp客戶端,可是還麼有實現具體的功能' def __init__(self,addr): print('正在鏈接服務器[%s]' %addr) self.addr=addr
#from module import FtpClient f1=FtpClient('192.168.1.1') if hasattr(f1,'get'): func_get=getattr(f1,'get') func_get() else: print('---->不存在此方法') print('處理其餘的邏輯')
好處二:動態導入模塊(基於反射當前模塊成員)code
module_t = __import__("m1.t")#只會找到m1這一層,不會找到t print(module_t) module_t.t.test #執行t模塊下的test方法 import importlib m = importlib.import_module("m1.t")#直接找到t print(m)
module_t.test #執行t模塊下的test方法