反射机制
它可以把字符串映射成实例的变量或实例的方法然后可以去执行调用、修改等操作。
它有四个重要的方法:
- getattr 获取指定字符串名称的对象属性
- setattr 为对象设置一个属性
- hasattr 判断对象是否有对应的对象(字符串)
- delattr 删除对象的属性
attr是属性英文的前几个字母,属性指的是类中类变量、实例变量和方法。但是要注意不能是私有的,如果你的变量是以“_”开头,那将无法获取。
getattr()函数的使用方法:接收2个参数,前面的是一个类或者模块,后面的是一个字符串,注意了!是个字符串!
#
反射到底有什么用?考虑有这么一个场景:需要根据用户输入url的不同,调用不同的函数,实现不同的操作,也就是一个WEB框架的url路由功能。路由功能是web框架里的核心功能之一,例如Django的urls。
原理:func = getattr(commons,inp)语句是关键,通过getattr()函数,从commons模块里,查找到和inp字符串“外形”相同的函数名,并将其返回,然后赋值给func变量。变量func此时就指向那个函数,func()就可以调用该函数。
#
应用场景1、View类的dispatch通过接收到的请求方法变为小写从而使用反射得到类中的相对应方法
2、settings配置中心和中间件使用了反射