先理一下概念
反射严谨解释:通过字符串的形式操作对象或模块中的成员。
反射通俗解释:反射就是从一个东西里取出属于他的成员(可以判断、调用、编辑、删除)
我们用成员调用来对比解释一下更清楚
- 正常调用:程序员自己知道什么时候调用哪个属性或方法。比如:对象.属性、对象.方法()
- 反射调用:由用户来决定(输入或点击)什么时候调用哪个属性或方法。比如:g = getattr(对象, '属性或方法名')
操作成员包括判断、调用、设置、删除,python内置了四个方法专门操作成员,简单介绍一下
- 成员判断:hasattr(obj, 'age') 对象obj中存在age成员返回True,不存在返回False
- 成员调用:getattr(obj, 'age') 对象obj中取出age成员,age如果是方法则加小括号调用
- 成员设置:setattr(obj, 'age', 10) 对象obj中设置age成员属性为10
- 成员删除:delattr(obj, 'age') 对象obj中删除age成员
反射调用比正常调用要麻烦些,但是为什么要用反射调用呢?
原因:用户输入或点击的链接一般都是字符串形式(不是字符串也可以转换成字符串)
先通过下面的示例知道反射如何使用
1、从对象中取成员
正常调用
反射调用
再来一个示例说明反射的方便的地方
有的web框架就用反射来做URL路由,通过下面示例我想你应该了解了反射
示例功能:通过用户输入不同的字符串,执行不同的函数
正常调用(如果方法多不好写了)
反射调用(不管多少方法)
上面示例都是基于类来做的解释,基本已能说明反射的用途。
2、从模块中取成员
模块是一样的,下面看看模块成员及调用,你就明白了。
模块成员
模块成员的反射调用