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>


参考 :http://www.cnblogs.com/mingaixin/archive/2013/01/29/2881113.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值