歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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 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 的下載地址:請點這裡 

Copyright © Linux教程網 All Rights Reserved