網站首頁 編程語言 正文
一、導包案例
我們導入第三方庫,可以使用import。那我們現在有一個需求,我需要動態輸入一個模塊名,然后導入,這應該怎么做呢?
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "反射.py" __time__ = "2022/8/10 13:11" # package = input("請輸入您想導入的庫:") package = "requests" # 導入requests庫 req = __import__(package) # 通過字符串的方式導入庫 resp = req.get("https://www.baidu.com") # 調用庫中的函數 print(resp)
上面我們實現了動態輸入模塊名,從而使我們能夠輸入模塊名并且執行里面的函數。但是上面有一個缺點,那就是執行的函數被固定了。那么,我們能不能改進一下,動態輸入函數名,并且來執行呢?
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "反射.py" __time__ = "2022/8/10 13:11" # package = input("請輸入要調用的模塊:") package = "demo01" # 導入第三方模塊 req = __import__(package) # 導入庫 # func = input("請輸入要執行的函數:") func = "func" # 要執行的函數 _ = getattr(req, func, None) # 獲取名為func的函數,如果沒有返回None _() # 調用函數
面我們就實現了,動態導入一個模塊,并且動態輸入函數名然后執行相應功能。
當然,上面還存在一點點小問題:那就是我的模塊名有可能不是在本級目錄中存放著。有可能是如下圖存放方式:
那么,我們應該如何解決呢?這時可以添加一個參數,fromlist
:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "反射.py" __time__ = "2022/8/10 13:11" # package = input("請輸入要調用的模塊:") package = "test.demo01" # 級聯導入 req = __import__(package, fromlist=True) # 導入庫,注意要添加fromlist參數 # func = input("請輸入要執行的函數:") func = "func" # 要執行的函數 _ = getattr(req, func, None) # 獲取名為func的函數,如果沒有返回None _() # 調用函數
二、基礎知識
1、是什么
什么是反射?
- 有時我們要訪問某個變量或是方法時并不知道到底有沒有這個變量或方法,所以就要做些判斷。判斷是否存在字符串對應的變量及方法。
- 我們知道訪問變量時是不能加引號的,否則會被當成字符串處理。如果要通過字符串找到對應的變量,那該怎么辦呢?
反射就是用于解決上面兩個問題而產生的,所謂反射,按我的理解就是反過來告訴我字符串是什么,是變量或者是方法
python的反射,它的核心本質其實就是利用字符串的形式去對象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基于字符串的事件驅動!
python中訪問類或對象的成員有三種方法:
如下所示 obj 為對象 var為變量 func為函數
1、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')
反射的方法:
hasattr(obj,name_str): 判斷objec是否有name_str這個方法或者屬性
getattr(obj,name_str): 獲取object對象中與name_str同名的方法或者函數,有則返回地址
setattr(obj,name_str,value): 為object對象設置一個以name_str為名的value方法或者屬性
delattr(obj,name_str): 刪除object對象中的name_str方法或者屬性
2、怎么用
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "反射.py" __time__ = "2022/8/10 13:11" def func(self): print("hello world", self) # 首先,我們創建一個學生類,這個學生類沒有綁定任何屬性和方法 class Stu: pass s = Stu() # 我們可以使用反射機制,對類成員進行方法和屬性的綁定,如我們創建一個成員方法 if hasattr(s, "func"): # 如果有這個函數,進行刪除,重新綁定 delattr(s, "func") setattr(s, "func", func) # 進行函數的綁定,注意,給Stu綁定和給s綁定的效果是不一樣的 _ = getattr(s, "func", None) # 對這個函數進行查找 _(s) # 調用函數,等于是調用了成員函數,需要手動傳遞self
三、使用案例
python反射機制在路由中比較常見
import requests class Http(object): def get(self, url): """get請求""" res = requests.get(url) response = res.text return response def post(self, url): """post請求""" res = requests.post(url) response = res.text return response # 使用反射后 url = "https://www.baidu.com" method = input("請求方法>>>:") h = Http() if hasattr(h, method): func = getattr(h, method) res = func(url) """ 如果給通過類獲取這個方法,則調用時需要傳入類成員 func = getattr(Http, method) res = func(h, url) """ print(res) else: print("你的請求方式有誤...")
原文鏈接:https://blog.csdn.net/qq_62789540/article/details/126265034
相關推薦
- 2023-02-23 golang?int64轉int的方法_Golang
- 2021-10-04 Flutter輸入框TextField屬性及監聽事件介紹_Android
- 2022-10-11 pandas?df.sample()的使用_python
- 2023-05-08 Python隨機生成8位密碼的示例詳解_python
- 2022-09-17 利用Python提取PDF文本的簡單方法實例_python
- 2023-09-17 adb shell cmd wifi(系統服務:wifi)
- 2022-04-29 C++圖解單向鏈表類模板和iterator迭代器類模版詳解_C 語言
- 2022-04-27 ABP框架中的事件總線功能介紹_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支