Python中的反射与自省

本文主要介绍 python 中的反射和自省,以及该机制的简单应用

熟悉 JAVA 的程序员,一定经常和 Class.forName 打交道。即使不是经常亲自调用这个方法,但是在很多框架中( Spring eclipse plugin 机制)都依赖于 JAVA 的发射和自省能力。而在 python 中,也同样有着强大的反射和自省能力,本文将做简单的介绍。

 

首先看一下自省,介绍一下几个重要的函数:

dir 函数,传入的参数是对象,返回该对象的所有属性和函数列表:

如:

 

 

 

 

可以看到, string 对象的所有函数,属性都列举出来了。

 

getattr 方法,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例,如下:

 

 

 

 

callable 方法,如果传入的参数是可以调用的函数,则返回 true ,否则返回 false

 

 

 

 

下面这段代码列出对象所有函数:

methodList = [method for method in dir(object) if callable(getattr(object,method))]

比如查看 string 的所有函数:

 

 

 

 

接下来,看看 python 的是如何体现反射的。

globals ()

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

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

 

 

 

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

 

 

 

在导入 sgmllib ,如下 :

 

 

 

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

 

 

 

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

 

 

 

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

 

 

 

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

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

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

 

 

 

 

 

由此可见, python 提供的反射和自省机制是十分便捷的。这也方便了很多操作。比如,如下这段代码,将导入脚本文件所在文件夹下的所有测试文件(以 test 结尾的脚本文件 0 ,并进行测试。

 

 

 

 

代码出自 dive in python (这本书写的很好),比较容易理解,不做详细介绍了。主要是先获得目录,然后过滤出符合条件的脚本文件,去掉后缀名,作为模块加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值