• 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函数可以实现反射,这个对于需要在程序运行时才生成对象以及调用对象的项目中是很有用的。

  • 相关阅读:
    Will Go eventually replace C++ as Google hoped when Go came out?
    5G到底什么时候来,它究竟能给我们带来什么?
    eog——Eye of GNOME Image Viewer
    Appweb——Embedded Web Server
    【2017】数字重排
    【9203】众数
    【2034】四人投票
    【9204】第k小整数
    【2031】求一元三次方程的解
    iOS 7: 如何为iPhone 5s编译64位应用
  • 原文地址:https://www.cnblogs.com/panyinghua/p/3297873.html
Copyright © 2020-2023  润新知