python中的反射

來源:互聯網
上載者:User

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()    


 


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.