【测试开辟】python系列教程:python反射

打印 上一主题 下一主题

主题 527|帖子 527|积分 1581

这次我们分享python的反射
  
  在java中大家都知道,java的反射的机制,其着实python中也是有反射机制的,我们看下怎样 来用?
  一、什么是反射?
  程序可以访问、检测和修改'本身状态'或者举动的一种能力。大白话:其实就是通过字符串操纵对象的数据和方法
  二、反射的作用
  正常使用对象中的方法是要通过变量名去调用的, 使用反射可以让用户,通过输入字符串,调用对象中的数据或者方法。
  三、python反射的四个方法
  hasattr() 判断对象是否含有字符串对应的数据或者功能
  getattr() 根据字符串获取对应的变量名或者函数名
  setattr() 根据字符串给对象设置数据 (名称空间的名字)
  delattr() 根据字符串删除对象对应的数据 (名称空间中的名字)
  四、代码演示
  hasattr
  结果:
              
           getattr()
  1. class Dog():
  2.     name='123'
  3.     def printagename(self):
  4.         print('111')
  5. # 1.获取类中的值
  6. print(getattr(Dog,'name'))
  7. # 2.获取类中的方法
  8. print(getattr(Dog,'printagename'))
  9. # 3.调用
  10. a=Dog()
  11. getattr(Dog,'printagename')(a)
  12. # 4.获取对象中的方法
  13. print(getattr(a,'name'))
复制代码
结果展示
              
           setattr()
  1. class Dog():
  2.     name='123'
  3.     def printagename(self):
  4.         print('111')
  5. # 1.获取类中的值
  6. print(getattr(Dog,'name'))
  7. #2.通过反射修改
  8. setattr(Dog,'name','addddd')
  9. #3.获取修改后结果
  10. print(getattr(Dog,'name'))   
复制代码
结果展示:
              
           delattr()
  1. class Dog():
  2.     name='123'
  3.     def printagename(self):
  4.         print('111')
  5. # 1.获取类中的值
  6. print(getattr(Dog,'name'))
  7. #2.通过反射删除
  8. delattr(Dog,'name')
  9. #3.获取修改后结果
  10. print(getattr(Dog,'name'))
复制代码
结果展示
              
           可以看到,在我们删除后,就没有这个属性或者方法了。
  来看一个小案例
  1. 考虑有这么一个场景:需要根据用户输入url的不同,
  2. 调用不同的函数,实现不同的操作,
  3. 也就是一个WEB框架的url路由功能。
  4. 路由功能是web框架里的核心功能之一,例如Django的urls。
复制代码
看下怎样来实现
  先来四个可以函数,来模仿不通的地址的文件
  1. def login():
  2.    print("这是一个登陆页面!")
  3. def logout():
  4.    print("这是一个退出页面!")
  5. def home():
  6.    print("这是网站主页面!")
复制代码
来实现路由的分发
  1. import url
  2. def run():
  3.    inp = input("请输入您想访问页面的url:  ").strip()
  4.    if inp == "login":
  5.       url.login()
  6.    elif inp == "logout":
  7.       url.logout()
  8.    elif inp == "home":
  9.       url.home()
  10.    else:
  11.       print("404")
  12. if __name__ == '__main__':
  13.     run()
复制代码
实行
              
           这就实现了一个简单的url路由功能,根据不同的url,实行不同的函数,得到不同的页面。
  然而,让我们思考一个题目,如果有成百上千个路径函数呢(这很常见)?难道在run模块里写上成百上千个elif?显然这是不可能的!那么怎么办?
  可以通过反射来实现
  1. import url
  2. def run():
  3.    inp = input("请输入您想访问页面的url:").strip()
  4.    func = getattr(url, inp)
  5.    func()
  6. if __name__ == '__main__':
  7.     run()
复制代码
实行验证
  存在的url
              
           
不存在的url

              
           怎样改进呢,其实很简单,我们分享过hasattr可以判断,我们在实行前做个判断即可
  访问存在的url
              
           访问不存在的url
              
           通过hasattr()的判断,可以防止非法输入导致的错误,并将其统一定位到错误页面。
  
末了: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果必要可以自行免费领取【包管100%免费】

              
           

  
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也伴随上万个测试工程师们走过最困难的路程,盼望也能资助到你!

              

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表