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()
--------------------------------------分割线 --------------------------------------
Python 的详细介绍:请点这里
Python 的下载地址:请点这里