Python反射機制理解

2021-09-08 13:09:10 字數 4277 閱讀 4472

python反射機制用沛齊老師總結的話說就是:利用字串的形式去物件(模組)中操作(尋找)成員。
object代表模組,name代表模組中的屬性或成員,該函式表達獲取object模組中的

屬性或者成員。例如getattr(commons,"login")表示去commons模組裡去找

login成員,而這裡的login在commons模組裡是乙個函式名,代表著login的函式體。

object代表模組,name代表模組中的屬性或成員,該函式用於確認object模組中是否存在

name屬性或成員,返回只為true或false,可搭配getattr(object,name)方法一起使用。

設定某個模組裡的成員或屬性,setattr(x, 'y', v) is equivalent to ``x.y = v''
刪除某個模組裡的成員或屬性,delattr(x, 'y') is equivalent to ``del x.y''
與普通的import不同的是,__import__()括號裡面匯入的字串格式的模組名。

import commons

def run():

inp = input('

請輸入要訪問的url:')

if inp == '

login':

commons.login()

elif inp == '

logout':

commons.logout()

elif inp == '

home':

commons.home()

else

: print(

'404')

if __name__ == '__main__': # 通過主函式進行呼叫

run()

# 當使用者想要訪問login頁面的時候,直接模擬輸入login字串,

# 呼叫匯入的commons.login()函式即可列印輸出登入頁面,

# 呼叫匯入的commons.logout()即可列印退出頁面

# 依此類推...

# 但是如果乙個**有成千上萬的網頁的時候要寫成千上萬個if-elif-else嗎,

# 效率太低了,這個時候就用到了下面的python的反射。

import commons

def run():

inp = input('

請輸入要訪問的url:')

ifhasattr(commons,inp):

func =getattr(commons, inp)

func()

else

: print(

'404-頁面不存在')

if __name__ == '__main__': # 通過主函式進行呼叫

run()

# 該例項利用了python反射,inp為接收使用者輸入字串,型別為字串型別

# func代表了commons模組中的login函式名。因此以上語句表達了這樣的含義:

# 接收使用者輸入的乙個字串並賦值給變數inp,通過hasattr函式確認commons模組中

# 是否存在inp屬性,如果有的話繼續通過getattr()呼叫該函式並列印,如果沒有就列印404

# 我們在瀏覽器上訪問**上具體某個網頁的時候,url的通常是

# 通過gehttp:

這樣的結構向伺服器傳送get或post請求。

# 但是**上有成千上萬個功能模組或網頁,而如果要向通過這種結構的url請求資源的話,

# 目錄結構優化:

# 與使用者賬戶相關的模組都去account.py中查詢,與後台管理的都去manager.py中去查詢

# --根目錄

# --index.py

# --account.py

# --login()

# --logout()

# --manager.py

# --order()

# 要想通過account/login這種方式請求某個資源的時候就必須借助__import__("

模組名")來匯入模組了。

練習三 : 使用__import__()匯入模組,並使用split分割模組與屬性,使python反射更靈活
# __import__() 括號內應該是字串,通過輸入字串形式的模組名就可以匯入該模組了。

# obj = __import__("

commons")

# obj.login() 等同與import commons , commons.login()

def run():

# 以輸入account/login為例(account模組中的login函式)

inp = input('

請輸入要訪問的url:')

# 通過split將輸入inp分割成account模組和login函式,account賦值給m,login賦值給f

m , f = inp.split('/'

) # 將m以字串格式匯入,並指向obj

obj =__import__(m)

# 獲取到了模組與模組內的屬性或函式,就可以繼續借助反射來進行操作了。

ifhasattr(obj,f):

func =getattr(obj,f)

func()

else

: print(

'404')

# 輸出結果:

# 請輸入要訪問的url:account/login

# 登陸頁面

if __name__ == '__main__': # 通過主函式進行呼叫

run()

練習四 : 匯入模組不在當前路徑,需要用字串拼接成完整模組路徑,並指定fromlist屬性。
# 以上練習時的目錄結構基本上都是在同一目錄結構裡的,如果需要匯入的模組在某個資料夾中的時候,在使用

# __import__()匯入模組的時候就需要考慮目錄結構然後用字串的拼接成完整的模組路徑了,例如以下目錄結構。

# 要匯入的account放在了lib資料夾下。

# --根目錄

# --index.py

# --lib(資料夾)

# --account.py

# --login()

# --logout()

# --manager.py

# --order()

def run():

inp = input('

請輸入要訪問的url:')

m , f = inp.split('/'

) # 要匯入模組的完整路徑:lib.account

# 注意:拼接後的模組路徑為

"lib.account

",但是預設情況下python只會匯入點(.)前的第乙個模組,也就是lib

# 需要在括號後面加乙個fromlist =true屬性才可以匯入完整的模組路徑。

obj = __import__("

lib.

" + m , fromlist=true)

ifhasattr(obj,f):

func =getattr(obj,f)

func()

else

: print(

'404

')

if __name__ == '__main__': # 通過主函式進行呼叫

run()

# 輸出結果:

# 請輸入要訪問的url:account/login

# 登陸頁面

commons.py

def login():

print(

'登陸頁面')

def logout():

print(

'退出頁面')

def home():

print(

'主頁面

')

account.py

def login():

print(

'登陸頁面')

def logout():

print(

'退出頁面

')

python反射機制

本文總結python的反射機制,以及其簡單應用 首先要說的是globals 函式 在沒有任何模組匯入的情況下,執行globals函式,函式返回的是乙個包含當前作用域的全域性變數的字典,key是全域性範圍內物件的名字。globals 然後先導入乙個模組 os 在執行globals函式 import o...

python反射機制

反射的本質 反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件 模組 中操作 查詢 獲取 刪除 新增 成員,一種基於字串的事件驅動!下面我們通過反射機制在web路由上的應用來介紹反射 首先我們來看如下 的設計 users.py 模組中 visit模組中...

python反射機制

根據不同的場景執行不同的函式,可以將這種寫入配置中,讀取配置,執行對應的函式,這個時候獲取的函式為字串,如何執行該字串呢?反射就是通過字串的形式,匯入模組 反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件中操作屬性或者函式利用字串的形式去物件中操作屬...