在 Java 中我们经常使用反射,而且大部分的 Java 框架都是基于反射实现的。那么 Python 中是否也有反射呢?答案是肯定的。那么 Python 中的反射如何使用呢?
概念
有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入。举个具体的例子:需要调用的方法名是前端通过接口传入的,而在代码编写时根本无法确定前端会传入具体的那个方法名,因此无法确定调用哪个方法,这时,我们需要通过某种机制访问未知的属性。这个机制被称为反射。
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动!
相关方法
- dir([obj]):
调用这个方法将返回包含 obj 大多数属性名的列表(会有一些特殊的属性不包含在内)。obj 的默认值是当前的模块对象。
- hasattr(obj, attr):
这个方法用于检查 obj 是否有一个名为 attr 的值的属性,返回一个布尔值。
- getattr(obj, attr):
判断对象 obj 是否包含名为 attr 的特性,将返回 obj 中名为 attr 值的属性的值,例如如果 attr 为 bar,则返回 obj.bar
。
- setattr(obj, attr, val):
调用这个方法将给 obj 的名为 attr 的值的属性赋值为 val。例如如果 attr 为 bar,setattr(obj,'bar',val)
相当于 obj.bar = val
。
- delattr(obj, name)
与 setattr() 相关的一组函数,删除模块中某个变量或者函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string 参数必须是对象属性名之一。该函数删除该 obj 的一个由 string 指定的属性。delattr(bar,'age')
实例
1 | class Cat(object): |
运行结果:
1 | name is: kitty |