反射就是經過字符串來操做類或者對象的屬性python
反射被稱爲框架的基石,爲何 由於框架的設計者,不可能提早知道你的對象究竟是怎麼設計的 因此你提供給框架的對象 必須經過判斷驗證以後才能正常使用 判斷驗證就是反射要作的事情, 固然經過__dict__也是能夠實現的, 其實這些方法也就是對__dict__的操做進行了封裝
它Python自省的核心函數框架
class A: def __init__(self): self.name = 'nick' # self.age='18' def method(self): print("method print") a = A() print(getattr(a, 'name', 'not find')) # 若是a 對象中有屬性name則打印self.name的值,不然打印'not find' print(getattr(a, 'age', 'not find')) # 若是a 對象中有屬性age則打印self.age的值,不然打印'not find' print(getattr(a, 'method', 'default')) # 若是有方法method,不然打印其地址,不然打印default print(getattr(a, 'method', 'default')()) # 若是有方法method,運行函數並打印None不然打印default
說明:判斷對象object是否包含名爲name的特性(hasattr是經過調用getattr(ojbect, name)是否拋出異常來實現的)
這是相對應的getattr()。參數是一個對象,一個字符串和一個任意值。字符串可能會列出一個現有的屬性或一個新的屬性。這個函數將值賦給屬性的。該對象容許它提供。例如,setattr(x,「foobar」,123)至關於x.foobar = 123。
與setattr()相關的一組函數。參數是由一個對象(記住python中一切皆是對象)和一個字符串組成的。string參數必須是對象屬性名之一。該函數刪除該obj的一個由string指定的屬性。delattr(x, 'foobar')=del x.foobar
myframework.py
函數
import importlib import settings # 框架已經實現的部分 def run(plugin): while True: cmd = input("請輸入指令:") if cmd == "exit": break # 由於沒法肯定框架使用者是否傳入正確的對象因此須要使用反射來檢測 # 判斷對象是否具有處理這個指令的方法 if hasattr(plugin,cmd): # 取出對應方法方法 func = getattr(plugin,cmd) func() # 執行方法處理指令 else: print("該指令不受支持...") print("see you la la!") # 建立一個插件對象 調用框架來使用它 # wincmd = plugins.WinCMD() # 框架以外的部分就有自定義對象來完成 # 框架 得根據配置文件拿到須要的類 path = settings.CLASS_PATH # 從配置中單獨拿出來 模塊路徑和 類名稱 module_path,class_name = path.rsplit(".",1) #拿到模塊 mk = importlib.import_module(module_path) # 拿到類 cls = getattr(mk,class_name) # 實例化對象 obj = cls() #調用框架 run(obj)
settings.py
插件
"""該文件做爲框架的配置文件""" # 做爲框架使用者 在配置文件中指定你配合框架的類是哪一個 CLASS_PATH = "libs.plugins.LinuxCMD"