内省与反射对于编程语言来说,是非常重要的特性,对Python同样如此。如果灵活运营,可以大大提高我们对代码的掌控能力。今天,小编就来带大家看一看Python中的这两项“黑科技”。
内省内省,有时也叫类型内省,是在运行时进行的一种对象检测机制。我们可以通过内省来获取一个对象的所有信息,比如这个对象的类型,其中包含哪些属性等等。让我们来看两个例子:例子1:dir()dir()是内省机制中的一个重要内置函数。这个函数可以将一个对象的所有属性以字符串列表的形式返回。
Python中的“黑科技”:内省(Introspection)与反射(Reflection)
注意,在使用isinstance()时有一个坑,那就是对于有继承关系的两个类,它的结果始终是True。比如下面这两个类,logging.FileHandler继承自logging.StreamHandler。尽管这两个类并不相同,但是isinstance()的结果是True。
除了上面举的例子,Python中利用内省还能做很多事情。下面,我们用inspect模块来实现一个很二的功能:用一个装饰器来检测一个对象是类还是函数。
反射与内省相比,反射的功能要显得更为强大。反射使得程序具有在运行时动态修改自己的结构和行为的能力。继续来看几个例子:例子1:动态设置属性假设有一个空模块,现在我们想把所有的环境变量作为属性添加到这个模块中。这个文件env.py可以这样实现:
import_module(__name__)把当前模块作为一个对象返回,setattr()将环境变量的key,value值作为属性添加到模块中去。事实上,import_module(__name__)也是利用里Python的反射能力。它根据输入的字符串参数生成了一个模块对象。
内置函数getattr()允许我们根据属性名来获取属性的值。例子3:动态方法下面小编要放大招了。我们要实现一个动态方法,当这个方法被调用时,它甚至都还没有被定义,但是仍然能够被成功调用。这是如何实现的呢?我们来看代码:
领取专属 10元无门槛券
私享最新 技术干货