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

这次我们分享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 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()

执行

这就实现了一个简单的url路由功能,根据不同的url,执行不同的函数,获得不同的页面。

然而,让我们思考一个问题,如果有成百上千个路径函数呢(这很常见)?难道在run模块里写上成百上千个elif?显然这是不可能的!那么怎么办?

可以通过反射来实现


import url


def run():

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

func = getattr(url, inp)

func()


if __name__ == '__main__':

run()

执行验证

存在的url

不存在的url

如何改进呢,其实很简单,我们分享过hasattr可以判断,我们在执行前做个判断即可

访问存在的url

访问不存在的url

通过hasattr()的判断,可以防止非法输入导致的错误,并将其统一定位到错误页面。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值