python中的反射

python是如何体现反射的:

 

globals ()

 

这个函数返回一个 map ,这个 map 的 key 是全局范围内对象的名字, value 是该对象的实例。

在不导入任何 module 下,执行 globals ()的结果如下:

>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

 

在导入 sys 后,可以发现, globals ()返回的 map 中,多了 sys module 

>>> import sys
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'sys': <module 'sys' (built-in)>, '__doc__': None, '__package__': None}

再导入symllib

>>> import sgmllib
>>> globals()
{'sgmllib': <module 'sgmllib' from '/usr/lib64/python2.6/sgmllib.pyc'>, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, '__name__': '__main__', '__doc__': None}

如果导入类后,在 map 中,可以找到类。

>>> from sgmllib import SGMLParser
>>> globals()
{'sgmllib': <module 'sgmllib' from '/usr/lib64/python2.6/sgmllib.pyc'>, 'SGMLParser': <class sgmllib.SGMLParser at 0x7ffd7fa0aa70>, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, '__name__': '__main__', '__doc__': None}

所以,只要将 class 的名字最为 key ,即可得到 class 。如下:

>>> globals()['SGMLParser']
<class sgmllib.SGMLParser at 0x7ffd7fa0aa70>

而如果要实例化一个对象,可以如下:

>>> globals()['SGMLParser']()
<sgmllib.SGMLParser instance at 0x7ffd7fe9ba28>

这样,实现了类似 java 中, Class.forName () .newInstance() 的功能。但是,在使用 globals 函数之前,还需要导入相应的类,如果不导入,而直接使用 globals[‘...’] 查找这个类,则会抛出异常。

所以,我在介绍一种可以动态导入的方法。

首先,介绍一个函数 __import__, 这个函数传入的参数是 module 的名字,返回这个 module ,然后,在结合之前介绍过的 getattr ,于是,我们可以写出下面两句代码,实现对象的反射。

>>> module=__import__('sgmllib')
>>> module
<module 'sgmllib' from '/usr/lib64/python2.6/sgmllib.pyc'>
>>> parser =  getattr(module,'SGMLParser')()
>>> parser
<sgmllib.SGMLParser instance at 0x7ffd7fe9ba28>

 

 

 

posted on 2013-01-29 11:21  mingaixin  阅读(628)  评论(0编辑  收藏  举报