這次我們分享python的反射
在java中大家都知道,java的反射的機(jī)制,其實(shí)在python中也是有反射機(jī)制的,我們看下如何 來(lái)用?
一、什么是反射?
程序可以訪問(wèn)、檢測(cè)和修改'本身狀態(tài)'或者行為的一種能力。大白話:其實(shí)就是通過(guò)字符串操作對(duì)象的數(shù)據(jù)和方法
二、反射的作用
正常使用對(duì)象中的方法是要通過(guò)變量名去調(diào)用的, 使用反射可以讓用戶,通過(guò)輸入字符串,調(diào)用對(duì)象中的數(shù)據(jù)或者方法。
三、python反射的四個(gè)方法
hasattr() 判斷對(duì)象是否含有字符串對(duì)應(yīng)的數(shù)據(jù)或者功能
getattr() 根據(jù)字符串獲取對(duì)應(yīng)的變量名或者函數(shù)名
setattr() 根據(jù)字符串給對(duì)象設(shè)置數(shù)據(jù) (名稱空間的名字)
delattr() 根據(jù)字符串刪除對(duì)象對(duì)應(yīng)的數(shù)據(jù) (名稱空間中的名字)
四、代碼演示
hasattr
結(jié)果:

getattr()
class Dog():
name='123'
def printagename(self):
print('111')
# 1.獲取類中的值
print(getattr(Dog,'name'))
# 2.獲取類中的方法
print(getattr(Dog,'printagename'))
# 3.調(diào)用
a=Dog()
getattr(Dog,'printagename')(a)
# 4.獲取對(duì)象中的方法
print(getattr(a,'name'))
結(jié)果展示

setattr()
class Dog():
name='123'
def printagename(self):
print('111')
# 1.獲取類中的值
print(getattr(Dog,'name'))
#2.通過(guò)反射修改
setattr(Dog,'name','addddd')
#3.獲取修改后結(jié)果
print(getattr(Dog,'name'))
結(jié)果展示:

delattr()
class Dog():
name='123'
def printagename(self):
print('111')
# 1.獲取類中的值
print(getattr(Dog,'name'))
#2.通過(guò)反射刪除
delattr(Dog,'name')
#3.獲取修改后結(jié)果
print(getattr(Dog,'name'))
結(jié)果展示

可以看到,在我們刪除后,就沒(méi)有這個(gè)屬性或者方法了。
來(lái)看一個(gè)小案例
考慮有這么一個(gè)場(chǎng)景:需要根據(jù)用戶輸入url的不同,
調(diào)用不同的函數(shù),實(shí)現(xiàn)不同的操作,
也就是一個(gè)WEB框架的url路由功能。
路由功能是web框架里的核心功能之一,例如Django的urls。
看下如何來(lái)實(shí)現(xiàn)
先來(lái)四個(gè)可以函數(shù),來(lái)模擬不通的地址的文件
def login():
print("這是一個(gè)登陸頁(yè)面!")
def logout():
print("這是一個(gè)退出頁(yè)面!")
def home():
print("這是網(wǎng)站主頁(yè)面!")
來(lái)實(shí)現(xiàn)路由的分發(fā)
import url
def run():
inp = input("請(qǐng)輸入您想訪問(wèn)頁(yè)面的url: ").strip()
if inp == "login":
url.login()
elif inp == "logout":
url.logout()
elif inp == "home":
url.home()
else:
print("404")
if __name__ == '__main__':
run()
執(zhí)行

這就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的url路由功能,根據(jù)不同的url,執(zhí)行不同的函數(shù),獲得不同的頁(yè)面。
然而,讓我們思考一個(gè)問(wèn)題,如果有成百上千個(gè)路徑函數(shù)呢(這很常見(jiàn))?難道在run模塊里寫上成百上千個(gè)elif?顯然這是不可能的!那么怎么辦?
可以通過(guò)反射來(lái)實(shí)現(xiàn)
import url
def run():
inp = input("請(qǐng)輸入您想訪問(wèn)頁(yè)面的url:").strip()
func = getattr(url, inp)
func()
if __name__ == '__main__':
run()
執(zhí)行驗(yàn)證
存在的url

不存在的url

如何改進(jìn)呢,其實(shí)很簡(jiǎn)單,我們分享過(guò)hasattr可以判斷,我們?cè)趫?zhí)行前做個(gè)判斷即可
訪問(wèn)存在的url

訪問(wèn)不存在的url

通過(guò)hasattr()的判斷,可以防止非法輸入導(dǎo)致的錯(cuò)誤,并將其統(tǒng)一定位到錯(cuò)誤頁(yè)面。
最后: 下方這份完整的軟件測(cè)試視頻學(xué)習(xí)教程已經(jīng)整理上傳完成,朋友們?nèi)绻枰梢宰孕忻赓M(fèi)領(lǐng)取【保證100%免費(fèi)】文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-744429.html

這些資料,對(duì)于【軟件測(cè)試】的朋友來(lái)說(shuō)應(yīng)該是最全面最完整的備戰(zhàn)倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)也陪伴上萬(wàn)個(gè)測(cè)試工程師們走過(guò)最艱難的路程,希望也能幫助到你!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744429.html

到了這里,關(guān)于【測(cè)試開(kāi)發(fā)】python系列教程:python反射的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!