博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的反射
阅读量:6680 次
发布时间:2019-06-25

本文共 1116 字,大约阅读时间需要 3 分钟。

反射

对于初学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)
一个使用反射的详细场景:

假如有serverA和B,A执行的是集中化任务分发,B接收A给出的任务

A通过queue把任务发送给B,任务内容是让B运行math.pow方法。B去queue中获取任务。此时就必需要使用到反射

在实际应用中,使用的queue应该是消息队列server。比如Redis,zeromq等server。这里使用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()

你可能感兴趣的文章
WINREG.H 编译出错
查看>>
Detours的使用准备
查看>>
xfs 文件系统损坏修复 fscheck
查看>>
Hibernate之一级缓存
查看>>
Python基础之定义有默认参数的函数
查看>>
443. String Compression - Easy
查看>>
Unity中那些事半功倍的好插件
查看>>
最全的Markdown语法
查看>>
npm i 的几种方式区别
查看>>
Eclipse界面简介
查看>>
iOS5中的UUID
查看>>
(转载)XML Tutorial for iOS: How To Read and Write XML Documents with GDataXML
查看>>
指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接,首先请断开所有现有的连接到网络共享的映射...
查看>>
poj 3259 Wormholes
查看>>
Apache CXFjar包目录(转)
查看>>
NewCoder_13_E 通知小弟[缩点]
查看>>
Elasticsearch 空值过滤
查看>>
spring、springboot、springcloud的区别
查看>>
ActiveMQ入门实例
查看>>
POJ1797 Heavy Transportation
查看>>