動態語言里面的eval就是干這個用的
創新互聯是專業的陵川網站建設公司,陵川接單;提供成都網站設計、成都網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行陵川網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
type1="int"
type2="str"
a=eval(type1+"(2222)") 這里a就是int型的2222 相當于執行a=eval("int(2222)")
b=eval(type2+("2222")) 這里b就是string型的"2222" 相當于執行b=eval("str(2222)")
另外Python偏函數特性也比較像這個,你可以搜索下看看。
這個也是python彪悍的特性.
自省就是面向對象的語言所寫的程序在運行時,所能知道對象的類型.簡單一句就是運行時能夠獲得對象的類型.比如type(),dir(),getattr(),hasattr(),isinstance().
反射機制就是在運行時,動態的確定對象的類型,并可以通過字符串調用對象屬性、方法、導入模塊,是一種基于字符串的事件驅動
通過源碼注釋我們知道,它返回對象是否具有指定名稱的屬性。而且它是通過調用getattr并捕獲AttributeError異常來判斷的。就像上面的屬性調用,我們就可以使用hasattr(a, "test")來判斷,通過源碼注釋我們也可以思考一下,eval這種是不是也可以實現這種方法呢?
但是這種方式是有缺陷的,因為test輸出了兩次,因為我們調用了兩次test(),這跟我們想要的效果不一樣。如果用hasattr呢,這個函數就不會在判斷的時候調用一次了。
有了判斷屬性是否存在的函數,那么就得有獲取屬性的函數了.
從源碼注釋我們就能知道獲取object對象的名為name的屬性,想到與object.name,如果提供了default參數,那么當屬性不存在的時候,就會返回默認值。同樣是上面的例子:
從例子中我們可以看出,hasattr并沒有調用test函數,而且getattr獲取到的是函數對象,也沒有調用它,通過我們主動執行func()才執行了a.test()函數,這樣相比于exec和eval就靈活了許多。
判斷和獲取屬性有了,那么設置屬性也是需要的.
動態加載模塊用的模塊importlib 里面的import_module(“字符串模塊路徑”, 相對路徑包名)
2.getattr(對象,“字符串屬性”,默認值)
補充
任意創建一個文件夾,在里面同級創建f1-f4.py的四個文件。
內容如下:
f1.py
f2.py
f3.py
f4.py
f5.py
f4.py:通過動態導入模塊,動態添加屬性 刪除。可以解決接口自動化中的動態傳參
F5.py: 通過傳參的方式,去獲取類的實例方法,可以做到不知道需要哪個方法的時候,用字符串的方法去調用需要的方法。接口自動化中參數化的時候可以用到。
反射機制,當通過類名去反射得到的實例方法,需要傳類名進去。通過self或者對象得到的實例方法,不需要傳self或者類名。如果是實例對象或者類 去調用靜態方法, 都不用給函數傳self cls
一。單例模式
一般情況下,類可以生成任意個實例,而單例模式只生成一個實例
我們先用單例模式設計一個Rectangle類
然后用__new__方法設計單例模式,代碼如下
然后我們來驗證下,單例模式下是否只能生成一個實例
單例模式在程序設計中比較典型的應用場景:多個用戶同時調用某個模塊時,會生成一些日志,我們希望這些日志存在同一個文件內,而不是多個文件。
在生成日志模塊我們就可以采用單例模式進行設計。
二。反射
概念:簡單來說就是可以利用字符串來映射模塊中的相應方法然后可以操作模塊中相應的方法
我們以一個飯店點菜的實際場景來理解Python的反射機制
hasatter(對象,屬性或方法名)
判斷對象中是否有某個屬性或某個方法,返回值是布爾型
getattr(對象,屬性或方法名,缺省值) 判斷對象中是否有某個屬性或某個方法,如果有返回方法本身,沒有則返回缺省值
setattr(對象,屬性,新值)
將實例的屬性改為新的值,如果屬性不存在則新建
我們給實例guke1加個價格屬性
標題名稱:python的函數反射,python 反射調用函數
分享網址:http://m.kartarina.com/article24/hdpgje.html
成都網站建設公司_創新互聯,為您提供關鍵詞優化、企業建站、服務器托管、網站內鏈、ChatGPT、域名注冊
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯