python中的反射

2018年9月2日 0 条评论 54 次阅读 0 人点赞

把反射的坑填上

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

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

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

如下所示:

class Test(object):
    def __init__(self):
        self.name = 'tesname'
        
    def foo(self,name):
        self.name = name
        
        
if __name__ == "__main__":
    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函数可以实现反射,这个对于需要在程序运行时才生成对象以及调用对象的项目中是很有用的。

lyssom

这个人太懒什么东西都没留下

文章评论(0)