1. 程式人生 > >內置函數補充 之 反射

內置函數補充 之 反射

... .py 圖片 TP HA 技術分享 web pla 分布

getattr 反射

為什麽要有反射?

當在設計一個頁面訪問的時候,通過用戶輸入相應的url,進入相應的頁面,在用戶輸入的url地址不存在的時候,返回404錯誤。

def run():
    inp = input(請輸入要訪問的url:)
    if inp == login:
        commons.login()
    elif inp == logout:
        commons.logout()
    elif inp == home:
        commons.home()
    else:
        print(404)


run()
技術分享圖片
def login():
    print(炫酷登錄頁面)


def logout():
    print(炫酷退出頁面)


def home():
    print(炫酷主頁面)
commons.py

但通過以上的形式進行編寫,如果一旦需要增添更多的頁面的時候,代碼寫入的工作量就變得巨大

getattr / hasattr

通過反射即可實現更高效的代碼,也是基於反射實現類Web框架的路由系統,

getattr(commons,inp) 的含義就是讓getattr自己去commons模塊中尋找inp輸入中對應的函數,即是login就對應login,是logout就應對logout。
import commons

def run():
    inp = input(請輸入要訪問的url:)
    #利用字符串的形式去對象(模塊)中操作(尋找/檢查)成員
    if hasattr(commons,inp):    #檢查是否有相應的成員,如果有進行操作
        func = getattr(commons,inp) #操作成員
        func()
    else:
        print(404)


run()
技術分享圖片
def login():
    print(炫酷登錄頁面)


def logout():
    print
(炫酷退出頁面) def home(): print(炫酷主頁面)
commons.py

反射的4個內置函數分別為:

getattr、hasattr、setattr、delattr ,其作用為獲取成員、檢查成員、設置成員、刪除成員

__import__()

如果不同的def函數沒有集中在同一個.py文件的模塊中,而是根據所能提供的不同功能,散列的分布在眾多的.py文件中的時候。

我們不可能去一個一個的import xxx對眾多的模塊進行一一導入,這個時候我們也可以對import的導入模塊的操作進行反射

即以"字符串"的形式導入模塊。

def run():
    inp = input(請輸入要訪問的url:)

    m,f = inp.split(/)
    obj = __import__(m)
    if hasattr(obj,f):    #檢查是否有相應的成員,如果有進行操作
        func = getattr(obj,f) #操作成員
        func()
    else:
        print(404)


run()

各__import__()和各.py文件之間的關系圖

技術分享圖片

建設中....

內置函數補充 之 反射