这次我们分享python的反射
在java中大家都知道,java的反射的机制,其实在python中也是有反射机制的,我们看下如何 来用?
一、什么是反射?
程序可以访问、检测和修改’本身状态’或者行为的一种能力。大白话:其实就是通过字符串操作对象的数据和方法
二、反射的作用
正常使用对象中的方法是要通过变量名去调用的, 使用反射可以让用户,通过输入字符串,调用对象中的数据或者方法。
三、python反射的四个方法
hasattr() 判断对象是否含有字符串对应的数据或者功能
getattr() 根据字符串获取对应的变量名或者函数名
setattr() 根据字符串给对象设置数据 (名称空间的名字)
delattr() 根据字符串删除对象对应的数据 (名称空间中的名字)
四、代码演示
hasattr
结果:
getattr()
class Dog():name='123'def printagename(self):print('111')# 1.获取类中的值print(getattr(Dog,'name'))# 2.获取类中的方法print(getattr(Dog,'printagename'))# 3.调用a=Dog()getattr(Dog,'printagename')(a)# 4.获取对象中的方法print(getattr(a,'name'))
结果展示
setattr()
class Dog():name='123'def printagename(self):print('111')# 1.获取类中的值print(getattr(Dog,'name'))#2.通过反射修改setattr(Dog,'name','addddd')#3.获取修改后结果print(getattr(Dog,'name'))
结果展示:
delattr()
class Dog():name='123'def printagename(self):print('111')# 1.获取类中的值print(getattr(Dog,'name'))#2.通过反射删除delattr(Dog,'name')#3.获取修改后结果print(getattr(Dog,'name'))
结果展示
可以看到,在我们删除后,就没有这个属性或者方法了。
来看一个小案例
考虑有这么一个场景:需要根据用户输入url的不同,调用不同的函数,实现不同的操作,也就是一个WEB框架的url路由功能。路由功能是web框架里的核心功能之一,例如Django的urls。
看下如何来实现
先来四个可以函数,来模拟不通的地址的文件
def login(): print("这是一个登陆页面!")def logout(): print("这是一个退出页面!")def home(): print("这是网站主页面!")
来实现路由的分发
import urldef run(): inp = input("请输入您想访问页面的url:").strip() if inp == "login":url.login() elif inp == "logout":url.logout() elif inp == "home":url.home() else:print("404")if __name__ == '__main__':run()
执行
这就实现了一个简单的url路由功能,根据不同的url,执行不同的函数,获得不同的页面。
然而,让我们思考一个问题,如果有成百上千个路径函数呢(这很常见)?难道在run模块里写上成百上千个elif?显然这是不可能的!那么怎么办?
可以通过反射来实现
import urldef run(): inp = input("请输入您想访问页面的url:").strip() func = getattr(url, inp) func()if __name__ == '__main__':run()
执行验证
存在的url
不存在的url
如何改进呢,其实很简单,我们分享过hasattr可以判断,我们在执行前做个判断即可
访问存在的url
访问不存在的url
通过hasattr()的判断,可以防止非法输入导致的错误,并将其统一定位到错误页面。
最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!