钜形不锈钢水箱 发表于 2024-8-24 02:39:03

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

这次我们分享python的反射
在java中大家都知道,java的反射的机制,其着实python中也是有反射机制的,我们看下怎样 来用?
一、什么是反射?
程序可以访问、检测和修改'本身状态'或者举动的一种能力。大白话:其实就是通过字符串操纵对象的数据和方法
二、反射的作用
正常使用对象中的方法是要通过变量名去调用的, 使用反射可以让用户,通过输入字符串,调用对象中的数据或者方法。
三、python反射的四个方法
hasattr() 判断对象是否含有字符串对应的数据或者功能
getattr() 根据字符串获取对应的变量名或者函数名
setattr() 根据字符串给对象设置数据 (名称空间的名字)
delattr() 根据字符串删除对象对应的数据 (名称空间中的名字)
四、代码演示
hasattr
结果:
            https://i-blog.csdnimg.cn/blog_migrate/9b4f0e8734289cebdd8fa2760fe80944.png         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'))结果展示
            https://i-blog.csdnimg.cn/blog_migrate/c88e398605823846dfe4662b9def9c69.png         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'))    结果展示:
            https://i-blog.csdnimg.cn/blog_migrate/069d52f48f9c84e803f42c22510cb68b.png         delattr()
class Dog():
    name='123'
    def printagename(self):
      print('111')
# 1.获取类中的值
print(getattr(Dog,'name'))
#2.通过反射删除
delattr(Dog,'name')
#3.获取修改后结果
print(getattr(Dog,'name'))结果展示
            https://i-blog.csdnimg.cn/blog_migrate/30d4fcdc0ae1d6ccffd7d17d1f0bec46.png         可以看到,在我们删除后,就没有这个属性或者方法了。
来看一个小案例
考虑有这么一个场景:需要根据用户输入url的不同,
调用不同的函数,实现不同的操作,
也就是一个WEB框架的url路由功能。
路由功能是web框架里的核心功能之一,例如Django的urls。看下怎样来实现
先来四个可以函数,来模仿不通的地址的文件
def login():
   print("这是一个登陆页面!")


def logout():
   print("这是一个退出页面!")

def home():
   print("这是网站主页面!")来实现路由的分发
import url

def 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()实行
            https://i-blog.csdnimg.cn/blog_migrate/ae8088c442f4915e6e24be97e9f94395.png         这就实现了一个简单的url路由功能,根据不同的url,实行不同的函数,得到不同的页面。
然而,让我们思考一个题目,如果有成百上千个路径函数呢(这很常见)?难道在run模块里写上成百上千个elif?显然这是不可能的!那么怎么办?
可以通过反射来实现
import url

def run():
   inp = input("请输入您想访问页面的url:").strip()
   func = getattr(url, inp)
   func()

if __name__ == '__main__':
    run()
实行验证
存在的url
            https://i-blog.csdnimg.cn/blog_migrate/1b61d2af2306087b0b4c626dbbb0fd99.png         不存在的url
            https://i-blog.csdnimg.cn/blog_migrate/ec606f07a1c3eebfaf71715cd55e6aaa.png         怎样改进呢,其实很简单,我们分享过hasattr可以判断,我们在实行前做个判断即可
访问存在的url
            https://i-blog.csdnimg.cn/blog_migrate/9c73a12e21881afcc9b8f7e58f31b9fc.png         访问不存在的url
            https://i-blog.csdnimg.cn/blog_migrate/a5d1f97eb6144600c5f6c166c25eb976.png         通过hasattr()的判断,可以防止非法输入导致的错误,并将其统一定位到错误页面。
末了: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果必要可以自行免费领取【包管100%免费】
            https://i-blog.csdnimg.cn/blog_migrate/298b1edd818e94c7b05ea9a8378c3de4.png         
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也伴随上万个测试工程师们走过最困难的路程,盼望也能资助到你!
            https://i-blog.csdnimg.cn/blog_migrate/3984c19aa11001d4cae9d0c30f3b9288.gif
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【测试开辟】python系列教程:python反射