這個(gè)也是python彪悍的特性.

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),滎陽網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:滎陽等地區(qū)。滎陽做網(wǎng)站價(jià)格咨詢:18982081108
自省就是面向?qū)ο蟮恼Z言所寫的程序在運(yùn)行時(shí),所能知道對(duì)象的類型.簡(jiǎn)單一句就是運(yùn)行時(shí)能夠獲得對(duì)象的類型.比如type(),dir(),getattr(),hasattr(),isinstance().
反射機(jī)制就是在運(yùn)行時(shí),動(dòng)態(tài)的確定對(duì)象的類型,并可以通過字符串調(diào)用對(duì)象屬性、方法、導(dǎo)入模塊,是一種基于字符串的事件驅(qū)動(dòng)
通過源碼注釋我們知道,它返回對(duì)象是否具有指定名稱的屬性。而且它是通過調(diào)用getattr并捕獲AttributeError異常來判斷的。就像上面的屬性調(diào)用,我們就可以使用hasattr(a, "test")來判斷,通過源碼注釋我們也可以思考一下,eval這種是不是也可以實(shí)現(xiàn)這種方法呢?
但是這種方式是有缺陷的,因?yàn)閠est輸出了兩次,因?yàn)槲覀冋{(diào)用了兩次test(),這跟我們想要的效果不一樣。如果用hasattr呢,這個(gè)函數(shù)就不會(huì)在判斷的時(shí)候調(diào)用一次了。
有了判斷屬性是否存在的函數(shù),那么就得有獲取屬性的函數(shù)了.
從源碼注釋我們就能知道獲取object對(duì)象的名為name的屬性,想到與object.name,如果提供了default參數(shù),那么當(dāng)屬性不存在的時(shí)候,就會(huì)返回默認(rèn)值。同樣是上面的例子:
從例子中我們可以看出,hasattr并沒有調(diào)用test函數(shù),而且getattr獲取到的是函數(shù)對(duì)象,也沒有調(diào)用它,通過我們主動(dòng)執(zhí)行func()才執(zhí)行了a.test()函數(shù),這樣相比于exec和eval就靈活了許多。
判斷和獲取屬性有了,那么設(shè)置屬性也是需要的.
python有個(gè)方法叫__getattribute__,可以耕具字符串來獲得類,應(yīng)該和反射差不多。
字符串轉(zhuǎn)為變量 可以用eval,還有個(gè) exec的函數(shù),不知道你的適合哪種,你可以試試。
反射機(jī)制是面向?qū)ο缶幊陶Z言中比較重要的功能,可以動(dòng)態(tài)獲取對(duì)象信息以及動(dòng)態(tài)調(diào)用對(duì)象,Python作為一門動(dòng)態(tài)編程語言,當(dāng)然也有反射機(jī)制,本文介紹Python反射函數(shù)使用方法。
在程序運(yùn)行時(shí)可以獲取對(duì)象類型定義信息,例如,Python中的type(obj)將返回obj對(duì)象的類型,這種獲取對(duì)象的type、attribute或者method的能力稱為反射。通過反射機(jī)制,可以用來檢查對(duì)象里的某個(gè)方法,或某個(gè)變量是否存在。也就是可以 通過字符串映射對(duì)象的方法或者屬性 。
Python反射常用的內(nèi)置函數(shù)
先創(chuàng)建一個(gè)類:
利用反射的能力,我們可以通過屬性字典 __dict__ 來訪問對(duì)象的屬性:
執(zhí)行輸出:
接下來測(cè)試一下其他反射函數(shù):
Out:
Out:
Out:
Out:
Out:
Out:
下面介紹兩種Python反射的應(yīng)用場(chǎng)景。
從前面舉的例子中,我們了解到可以通過 字符串 來獲取對(duì)象的屬性( getattr() ),這是非常有用的一個(gè)功能。比如,一個(gè)類中有很多方法,它們提供不同的服務(wù),通過輸入的參數(shù)來判斷執(zhí)行某個(gè)方法,一般的使用如下寫法:
如果函數(shù)比較少這樣寫沒有太大問題,如果有很多,這樣寫就比較復(fù)雜了,需要寫大量else語句,可以使用反射機(jī)制來寫:
這樣是不是簡(jiǎn)潔了很多,上面的例子中,通過反射,將字符串變成了函數(shù),實(shí)現(xiàn)了對(duì)對(duì)象方法的動(dòng)態(tài)調(diào)用。
可以通過setattr()方法進(jìn)行動(dòng)態(tài)屬性設(shè)置,在使用scapy庫(kù)構(gòu)造報(bào)文時(shí),我們需要設(shè)置某些報(bào)文字段,然而網(wǎng)絡(luò)協(xié)議的報(bào)文字段很多,在需要設(shè)置大量字段時(shí),一個(gè)一個(gè)的賦值就很麻煩:
可以使用setattr()方法來賦值:
--THE END--
動(dòng)態(tài)加載模塊用的模塊importlib 里面的import_module(“字符串模塊路徑”, 相對(duì)路徑包名)
2.getattr(對(duì)象,“字符串屬性”,默認(rèn)值)
補(bǔ)充
任意創(chuàng)建一個(gè)文件夾,在里面同級(jí)創(chuàng)建f1-f4.py的四個(gè)文件。
內(nèi)容如下:
f1.py
f2.py
f3.py
f4.py
f5.py
f4.py:通過動(dòng)態(tài)導(dǎo)入模塊,動(dòng)態(tài)添加屬性 刪除。可以解決接口自動(dòng)化中的動(dòng)態(tài)傳參
F5.py: 通過傳參的方式,去獲取類的實(shí)例方法,可以做到不知道需要哪個(gè)方法的時(shí)候,用字符串的方法去調(diào)用需要的方法。接口自動(dòng)化中參數(shù)化的時(shí)候可以用到。
反射機(jī)制,當(dāng)通過類名去反射得到的實(shí)例方法,需要傳類名進(jìn)去。通過self或者對(duì)象得到的實(shí)例方法,不需要傳self或者類名。如果是實(shí)例對(duì)象或者類 去調(diào)用靜態(tài)方法, 都不用給函數(shù)傳self cls
動(dòng)態(tài)語言里面的eval就是干這個(gè)用的
type1="int"
type2="str"
a=eval(type1+"(2222)") 這里a就是int型的2222 相當(dāng)于執(zhí)行a=eval("int(2222)")
b=eval(type2+("2222")) 這里b就是string型的"2222" 相當(dāng)于執(zhí)行b=eval("str(2222)")
另外Python偏函數(shù)特性也比較像這個(gè),你可以搜索下看看。
Pagel’s lambda,這是函數(shù)的名字。Python 中定義函數(shù)有兩種方法,一種是用常規(guī)方式 def 定義,第二種是用 lambda 定義,稱為 Lambda 函數(shù)或稱為匿名函數(shù)。lambda運(yùn)算符或lambda函數(shù)用于在Python中創(chuàng)建小的一次性匿名函數(shù)對(duì)象。
使用的好處:函數(shù)沒有名字,不需要命名,也不必?fù)?dān)心函數(shù)名沖突;大量簡(jiǎn)化了代碼,使代碼簡(jiǎn)練清晰;作為回調(diào)函數(shù),傳遞給某些應(yīng)用。
Python與其他語言的區(qū)別
1、在編寫代碼層面來說,python是最簡(jiǎn)單的,其大量的第三方庫(kù)可以讓程序員省去不少事,其他語言沒有python編寫快主要的原因是因?yàn)槠渚幊趟枷牒驼Z法規(guī)則所導(dǎo)致。
2、在運(yùn)行速度層面來說,python是最慢的,python是解釋型語言即運(yùn)行時(shí)才會(huì)翻譯語言,這是導(dǎo)致其運(yùn)行效率低下的本質(zhì)原因。其他語言是屬于靜態(tài)語言,都是直接編譯成字節(jié)碼文件。
3、從學(xué)習(xí)層面來說,C語言和C++的入門難度最大,java和python的入門難度稍小。
以上內(nèi)容參考:百度百科——Lambda表達(dá)式
分享文章:python反射函數(shù) python映射函數(shù)
標(biāo)題來源:http://www.js-pz168.com/article20/hiogco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、云服務(wù)器、手機(jī)網(wǎng)站建設(shè)、用戶體驗(yàn)、虛擬主機(jī)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)