手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Python中的反射

[日期:2015-03-17] 来源:Linux社区  作者:kobeyan [字体: ]

反射

对于初学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 的下载地址请点这里 

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-03/115091.htm

linux
相关资讯       Python反射 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款