python中的反射,python反射
反射
對於初學python可能較難理解,但反射是非常有用。
試想一下,當別的程式傳入給你寫的這段代碼一個變數(var=“math”),這個變數是一個字串,這個字串是一個模組或者一個模組下的某個方法,你需要通過變數來匯入此模組或者方法,如何匯入此模組或方法呢,如果直接執行 import var是會出錯的,因為var在你的這段代碼中是一個變數, 這時就需要反射, 如何使用反射呢。
如果這個變數值是一個模組,可以使用MathModule=__import__(var), 匯入後,你可以在你的代碼中用MathModule.***來調用math模組下的任意方法
當需要獲得一個模組下的某個方法時,可以使用getattr,下面有具體的例子。
例子,如何匯入通過變數匯入math模組
module="math"MathModule=__import__(module)print MathModule.pow(2,4)
例子,如何通過變數匯入方法,接上邊的代碼
func="pow"pow=getattr(MathModule,func)print pow(2,4)
一個使用反射的具體情境:
假如有伺服器A和B,A啟動並執行是集中化任務分發,B接收A給出的任務
A通過queue把任務發送給B,任務內容是讓B執行math.pow方法,B去queue中擷取任務,此時就必須要使用到反射
在實際應用中,使用的queue應該是訊息佇列伺服器,例如Redis,zeromq等伺服器,這裡使用python的Queue模組來類比
定義一個隊列:
import Queuequeue=Queue.Queue()
定義ServerA
def ServerA(): Dict={'server':'B','module':'math','func':'pow'} queue.put(Dict)
運行ServerA函數,將需要執行的任務放入隊列中.
ServerA()
定義ServerB,B去任務隊列中擷取任務:
def ServerB(): task=queue.get() #首先需要匯入module if task['server']=='B': MathModule=__import__(task['module']) #其次在module中找到task['func'] func=getattr(MathModule,task['func']) print func(2,4)
運行ServerB函數, 執行相應的任務.
ServerB()