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)框架
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()
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
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
一、目錄結構: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 !!!")