模塊講解----反射 (基於web路由的反射)

1、反射的實際案例:web

 1 def main():
 2     menu = ''' 
 3     一、帳戶信息
 4     二、還款
 5     三、取款
 6     四、轉帳
 7     五、帳單
 8     '''
 9     
10     menu_dic = {
11     '1':account_info,
12     '2':repay,
13     '3':withdraw,
14     '4':transfer,
15     '5':pay_check,
16     }
17     
18     while True:
19     print(menu)
20     user_option = input(">>: ").strip()
21     if user_option in menu_dic:
22         menu_dic[user_option]()
23         

 

反射的總結

一、實例:基於實例來講,就是僞造了web框架的路由系統,即經過一個URL,去定義到某一個模塊中的函數上。
二、反射:基於字符串的形式去對象(模塊)中,操做其成員。
getattr, delattr,setattr,hasattr
三、擴展:導入模塊
import xxx
from xxx import ooo數據庫

obj = __import__("xxx")
obj = __import__("xxx.oo.xxx"+m, fromlist=True)框架

 

 

基礎環境:
一、假若有個網頁,須要根據用戶輸入的不一樣的url路徑來展示,不一樣的頁面內容。
二、定義兩個模塊:commons  index
 
一、commons模塊:(模擬不一樣功能的頁面函數)
 1 '''
 2 根據用戶輸入的url不一樣,調用不一樣的函數。
 3 調用不一樣的函數,返回不一樣頁面的內容。
 4 '''
 5 
 6 
 7 def login():
 8     print('炫酷登陸頁面')
 9 
10 
11 def logout():
12     print('炫酷退出頁面')
13 
14 
15 def home():
16     print('炫酷主頁面')

 

 

二、index模塊:(判讀用戶輸入url的不一樣,返回不一樣的結果)ide

 1 '''
 2 判斷用戶輸入的url的不一樣,顯示不一樣的結果
 3 '''
 4 
 5 import commons
 6 
 7 def run():
 8     inp = input('請輸入要訪問的url>>>')
 9     if inp == 'login':
10         commons.login()
11     elif inp == 'logout':
12         commons.logout()
13     elif inp == 'home':
14         commons.home()
15     else:
16         print('404')
17 
18 
19 if __name__ == '__main__':
20     run()
問題:
一、以上是一個網站的三個函數,也是三個頁面功能。
二、現實中,一個網站中有多個頁面(成百上千個函數),來處理用戶的請求。
三、用戶訪問不少的頁面,訪問頁面越多,那處理訪問請求的函數就不同。
 
解決方法:
一、在commons模塊中要定義好多個頁面功能函數,這個不變有多少定義多少。
二、在index中,無需多個if判斷,只須要將用戶輸入的input值,自動匹配commons模塊裏的函數就OK了。
 
修改方法以下:
inp = input(’請輸入要訪問的url>>> ‘)
1 #inp獲取到的是字符串類型。 inp = 「login」
2 #commons.inp()  != commons.login  #回去找inp函數,而後執行
3 #利用字符串的形式去對象(模塊)中,去操做(尋找/檢查/刪除/設置)成員,反射
4 getattr(commons,inp)
5 hasattr(commons,inp)
6 setattr()
7 delattr()

 

反射的使用方法

1、經過反射,尋找/檢查模塊成員:函數

 1 import commons
 2 
 3 def run():
 4     inp = input("請輸入要訪問的url>>>  ")
 5 
 6     #判斷模塊中的方法是否存在:
 7     if hasattr(commons,inp):   #判讀模塊內的方法是否存在,若是返回爲True則調用。
 8 
 9         #獲取模塊中包含的成員:getattr(模塊名,用戶輸入的url)
10         func =  getattr(commons,inp)
11         func()
12 
13     else:             #若是返回False則打印錯誤信息 404。
14         print(404)
15 
16 
17 if __name__ == '__main__':
18     run()

 

2、字符串模式的尋找、導入模塊:網站

一、特色:基於web框架的URL路由模式的反射ui

二、用途:用戶輸入的url路徑轉成字符串的格式,而後調用相應的模塊名和方法:
例如:account/login
 
三、分析:該需求分爲2部分:
第一部分是:將用戶輸入的url轉成字符串。
第二部分是:利用反射的方式經過字符串調用相應的模塊和方法:
 1 def run():
 2     inp = input('請輸入要訪問的rul>>> ')    #獲取url
 3     m,f = inp.split('/')                  #將url轉換成字符串
 4     obj = __import__(m)                    #導入字符串中的模塊
 5 
 6     if hasattr(obj,f):                    #用內置函數判斷字符串中的函數和方法是否存在,
 7         func = getattr(obj,f)              #若是存在,就調用字符串中的模塊和方法
 8         func()                            #執行調用方法
 9 
10     else:                                #若是不存在則打印404
11         print(404)
12 
13 
14 if __name__ == '__main__':
15     run()                                 #本地函數調用
16 
17 
18 
19 顯示結果:
20 請輸入要訪問的rul>>> commons/db_mgs
21 炫酷的數據庫鏈接信息:

 

 

3、導入同級文件夾下的模塊:this

注意:__import__:在默認的時候只導入lib.xx的點前面那個lib模塊;
解決方法:須要用字符串拼接("目錄名." + 模塊名)
                 後參數(fromlist=True)

 

 

一、目錄結構:url

1 |day6
2 --| index.py
3 -- | lib
4     --| account.py
5     --| manager.py
6     --| commons.py  

 

二、案例:spa

def run():
    inp = input('請輸入url路徑>>>')
    m,f = inp.split('/')
    obj = __import__("lib."+m, fromlist=True) 

    if hasattr(obj,f):
      func = getattr(obj,f)
      func()


if __name__ == '__main__':
    run()


顯示結果:
請輸入url路徑>>>manger/order
炫酷的訂單頁面:

 

 

練習:

 1 #一、定義函數標題:
 2 #登陸&註冊
 3 login_register = '''
 4     一、登陸
 5     二、註冊
 6     三、退出
 7 '''
 8 
 9 login_register_dic = {
10     '1':'acc_login',
11     '2':'acc_auth',
12     '3':'quit'
13 }
14 
15 
16 
17 #二、定義函數體
18 def acc_login():
19     print('this is login')
20 
21 
22 def acc_auth():
23     print('This is auth')
24 
25 
26 def quit():
27     print("This is quit")
28 
29 
30 
31 #三、定義反射條件:
32 from core import logger
33 from core import login
34 from core import menu
35 def run():
36    '''
37     被調用的主接口,主要功能以下:
38     一、展現登陸註冊信息
39     二、經過反射的方式,來實現不一樣的功能選項,儘可能避免過多的if判斷
40     '''
41     label = menu.login_register
42     login_reg = menu.login_register_dic
43     flag = False
44     while not flag:
45         print(label)
46         inp = input("請輸入編號:").strip()
47         if inp in login_reg:
48             if hasattr(login,login_reg[inp]):
49                 func = getattr(login,login_reg[inp])
50                 func()
51 
52         else:
53             login_log.error("The input number does not exist, please try again !!!")
反射實例
相關文章
相關標籤/搜索