反射
對於初學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 Queue
queue=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()
--------------------------------------分割線 --------------------------------------
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡