python中的反射和自省

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

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

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

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

如:

>>> import string
>>> dir(string)
[‘ChainMap‘, ‘Formatter‘, ‘Template‘, ‘_TemplateMetaclass‘, ‘__builtins__‘, ‘__cached__‘,
‘__doc__‘, ‘__file__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__spec__‘, ‘_re‘, ‘_string‘,
‘ascii_letters‘, ‘ascii_lowercase‘, ‘ascii_uppercase‘, ‘capwords‘, ‘digits‘, ‘hexdigits‘,
‘octdigits‘, ‘printable‘, ‘punctuation‘, ‘whitespace‘]
>>>

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

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

>>> getattr(string, ‘printable‘)
‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\‘()*
+,-./:;<=>[email protected][\\]^_`{|}~ \t\n\r\x0b\x0c‘
>>>

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

>>> callable(getattr(string, ‘printable‘))
False
>>> callable(getattr(string, ‘punctuation‘))
False
>>> callable(getattr(string, ‘Formatter‘))
True
>>>

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

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

比如查看string的所有函数:

>>> methodList = [method for method in dir(string) if callable(getattr(string, method))]
>>> methodList
[‘ChainMap‘, ‘Formatter‘, ‘Template‘, ‘_TemplateMetaclass‘, ‘capwords‘]
>>>

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

globals()

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

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

>>> globals()
{‘__doc__‘: None, ‘__package__‘: None, ‘__builtins__‘: <module ‘builtins‘ (built-in)>,
‘__spec__‘: None, ‘__loader__‘: <class ‘_frozen_importlib.BuiltinImporter‘>,
 ‘__name__‘: ‘__main__‘}
>>>

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

>>> import sys
>>> globals()
{‘__doc__‘: None, ‘__package__‘: None, ‘__builtins__‘: <module ‘builtins‘ (built-in)>,
‘__spec__‘: None, ‘__loader__‘: <class ‘_frozen_importlib.BuiltinImporter‘>,
 ‘__name__‘: ‘__main__‘, ‘sys‘: <module ‘sys‘ (built-in)>}
>>>

在导入sgmllib,如下:

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

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

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

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

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

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

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

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

参考:http://blog.csdn.net/lokibalder/article/details/3459722

http://www.cnblogs.com/huxi/archive/2011/01/02/1924317.html

时间: 2024-08-16 00:05:29

python中的反射和自省的相关文章

python中的反射

在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些类和函数都是为了后序代码服务,程序员决定什么时候用到哪一个类,什么时候调用某个函数.但很多时候,我们需要根据用户的需求来决定执行哪一段代码块.用户可能是通过点击,输入数据,或者其他方式发出指令,反射则将用户的指令传递到需要执行的那一段代码块.这个过程是自动执行的,无需人工去核对用户指令是否应该执行那

python中使用反射的方法的代码

开发之余,把开发过程中常用的一些内容段做个珍藏,下面的内容是关于python中使用反射的方法的内容,应该是对码农们有一些用途. import sys, types,new def _get_mod(modulePath): try: aMod = sys.modules[modulePath] if not isinstance(aMod, types.ModuleType): raise KeyError except KeyError: # The last [''] is very imp

第三十四篇 Python面向对象之 反射(自省)

什么是反射? 反射的概念是由Smith在1982年提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成就. 四个可以实现自省的函数,是Python的内置函数 下列方法适用于类和对象 先看这四个方法对实例(b1)的使用 # 演示代码 class BlackMedium: feature = 'Ugly' def __init__(self, nam

Python基础之反射

python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Foo(object): def __init__(self,name): self.name = name def func(self): return

Python开发基础----反射、面向对象进阶

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class Foo(object): 2 pass 3 obj = Foo() 4 print(isinstance(obj, Foo)) issubclass(sub, super)检查sub类是否是 super 类的派生类,如果是返回True 1 class Foo(object): 2 pass 3 cla

四 python中关于OOP的常用术语

抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现这种模型.抽象不仅包括这种模型的数据属性,还定义了这些数据的接口. 对某种抽象的实现就是对此数据及与之相关接口的现实化(realization).现实化这个过程对于客户 程序应当是透明而且无关的. 封装/接口 封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数.通过任何客户端直接对数据的访问,无视接口,与封装性都是背道而驰的,除非程序员允许这些操作.作为实现的 一

Python之面向对象-反射

一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.Pythonn中的一切事物都是对象(都可以使用反射) 反射四种方法 一切皆对象,类本身也是一个对象 hasattr def hasattr(*args, **kwarg

Python面向对象之反射,双下方法

一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) class Foo:    f = '

python中关于OOP的常用术语

一.python中关于OOP的常用术语 1.1抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于描绘程序结构,从而实现这种模型.抽象不仅包括这种模型的数据属性,还定义了这些数据的接口. 对某种抽象的实现就是对此数据及与之相关接口的现实化(realization).现实化这个过程对于客户 程序应当是透明而且无关的. 1.2封装/接口 封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数.通过任何客户端直接对数据的访问,无视接口,与封装性都