python中的反射

    说起反射,大家应该都不陌生吧,特别是熟悉Java的程序员,一定经常和Class.forName打交道。Java的众多框架中,如Springeclipse plugin机制等很多都依赖于Java的反射技术。感觉反射在Java中属于比较高级的技术,通常作为高级主题来讲述。

    但是在Python中反射比java中简单得多。使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例。

    学习发现Python之后发现Python有个eval函数。eval 函数的功能是将字符串生成语句执行。

    如下所示:

#encoding=utf-8
'''
Created on 2013-08-29

@author: Martine
'''


class Test(object):
    def __init__(self):
        self.name = 'tesname'
        
    def foo(self,name):
        self.name = name
        
        
if __name__ == "__main__":
#     print 'this is my first python ...'
    eval_test = eval('Test()')
    print eval_test
    print 'old name is :%s ' % eval_test.name
    func = getattr(eval_test, 'foo')
    print func
    
    func('new_name')
    print 'new name is :%s ' % eval_test.name

输出如下:

<__main__.Test object at 0x000000000287CEF0>
old name is :tesname 
<bound method Test.foo of <__main__.Test object at 0x000000000287CEF0>>
new name is :new_name 

1.可以看到,使用eval('Test()')创建了一个Test对象,可以看到该对象的内存地址。

2.有了对象之后,就可以使用该对象的属性,如eval_test.name,可打印出来

3.可通过getattr(eval_test, 'foo')函数获取对象的foo函数的引用

4.然后可以直接像平常调用函数一样直接使用func('new_name'),修改对象的name值,打印新的name值发现是new_name,发现函数调用确实成功了。

 

总结:简单利用eval函数可以实现反射,这个对于需要在程序运行时才生成对象以及调用对象的项目中是很有用的。

posted @ 2013-09-02 23:45  martine  阅读(5835)  评论(0编辑  收藏  举报