Python 反射机制(二)
来源:互联网 发布:淘宝大学课程培训 编辑:程序博客网 时间:2024/05/17 22:24
一个面试题:
现有一个对象A和一个变量B,B的值是A的一个属性的名字,如何利用B修改A的那个属性?请参考下面代码。
class C:
def __init__(self):
self.attr = 3
self.attr2 = 4
A=C()
B = 'attr '
可以通过对象的setattr(obj,attr,val)方法来修改属性。将对象A的‘attr’属性改为5:setattr(A,B,5)。
考察python中的反射机制。反射的定义
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。
在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
所以上题中新增属性、获取新增属性值就属于反射机制。
本文主要介绍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(这本书写的很好),比较容易理解,不做详细介绍了。主要是先获得目录,然后过滤出符合条件的脚本文件,去掉后缀名,作为模块加载。
http://blog.chinaunix.net/uid-9687384-id-1998500.html
- Python 反射机制(二)
- 反射机制(二)
- C#反射机制(二)
- Java反射机制(二)
- java反射机制(二)
- Java反射机制(二)
- JAVA反射机制(二)
- android反射机制(二)
- 候捷谈Java反射机制(二)
- 候捷谈Java反射机制(二)
- 候捷谈Java反射机制(二)
- java的method反射机制(二)
- 通俗易懂解释java反射机制(二)
- Java学习 反射机制(二)
- 黑马程序员—反射机制(二)
- java基础知识(二)--反射机制
- Java反射机制梳理(二)
- 初识 java 反射机制 (二)
- script验证跳转按钮是否越界
- android布局--Android fill_parent、wrap_content和match_parent的区别
- 计数排序
- libcurl获取下载进度百分比,下载速度,剩余时间
- STM32的BootLoader 从SD卡更新固件
- Python 反射机制(二)
- j2ee项目中,获取当前webapp的路径
- Android项目打包成APK文件
- Java反射机制应用
- Leetcode 198 House Robber 抢劫最大金额
- 软件开发工具(五)——开发与发展
- 【asp】有效防止网站留言板出现垃圾留言/评论实现思路_ASP教程
- Redmine与TestLink的整合
- struts2解决get和post方式中文乱码