zoukankan      html  css  js  c++  java
  • python 反射

    反射的简单含义:

         通过方法名得到未知的方法(方法名不确定),实现调用。

         即:当我们需要执行对象的某个方法,或是需要对对象的某个字段赋值时,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入。下面是一个小例子:

         

    # -*- coding:utf-8 -*-
    __author__ = 'webber'
    import time
    
    class myClass(object):
        name = 'test'
    
        def cpu(self):
            print 'cpu func start!!!'
    
        def mem(self):
            print 'mem func start!!!'
    
        def disk(self):
            print 'disk func start!!!'
    
    def newfunc():
        print ''
        print "new func 33[31;1m%s33[0m has start!!!!" % user_input
    
    m = myClass()
    user_input = "test"   #raw_input("please input command:")
    if hasattr(m, user_input):   #判断类内是否有该方法
        func = getattr(m, user_input)  #获取类内的该方法,并赋给func
        func()                         #执行该方法
    else:
        print "----> 33[31;1m%s33[0m is not exist!!!" % user_input
        print 'please wait......'
        for i in range(3):
            time.sleep(1)
            print '..',
        setattr(m, user_input, newfunc)   #根据用户的错误输入,使用户自定义一个方法
        func = getattr(m, user_input)
        func()
    
        print 'run test' ,m.test()    #这里,test已经成为m实例化下的newfunc的新方法名,可供调用
    

    输出结果如下:
    ----> test is not exist!!!
    please wait......
    .. .. ..
    new func test has start!!!!
    run test
    new func test has start!!!!
    None


    下面在贴个实例(别人的):
    #-*-coding:utf-8-*-
    '''
    copy from http://www.linuxidc.com/Linux/2015-03/115091.htm
    python反射的一个应用场景:
    假设有服务器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()
    
    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,5)      #这里就相当于执行了pow(2,5)函数
    
    #运行ServerB函数, 执行相应的任务.
    ServerB()
    


    这里,成功的在Server B上执行了pow方法。输出结果:32.0

  • 相关阅读:
    基于 HTML5 WebGL 的 3D 仓储管理系统
    基于 HTML5 WebGL 的 3D “弹力”布局
    基于HTML5 Canvas 实现地铁站监控
    基于HTML5的WebGL经典3D虚拟机房漫游动画
    根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局
    玩转 HTML5 下 WebGL 的 3D 模型交并补
    基于HTML5 Canvas WebGL制作分离摩托车
    基于HTML5 Canvas的3D动态Chart图表
    基于HTML5 Canvas的工控SCADA模拟飞机飞行
    [iOS]过渡动画之高级模仿 airbnb
  • 原文地址:https://www.cnblogs.com/webber1992/p/5850744.html
Copyright © 2011-2022 走看看