1. 程式人生 > 程式設計 >python通過例項講解反射機制

python通過例項講解反射機制

一、反射機制簡介:

  • 通過字串的形式匯入模組
  • 通過字串的形式,去模組中尋找指定的函式,並執行
  • 規定使用者輸入格式 模組名/函式名 通過__import__的形式匯入模組,並通過 hasattr和getattr 檢查並獲取函式返回值。

相關方法:

  • getattr:--根據字串的形式去某個模組中尋找東西
  • hasattr:--根據字串的形式去某個模組中判斷東西是否存在
  • setattr:--根據字串的形式去某個模組中設定東西
  • delattr:--根據字串的形式去某個模組中刪除東西

二、反射機制初識:

test.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def f1():
return '我是F1,我被呼叫了'

def f2():
return '我是F2,我被呼叫了'

def f3():
return '我是F3,我被呼叫了'

index.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
反射機制
1.根據字串的形式匯入模組。
2.根據字串的形式去物件(某個模組)中操作其成員 
實現思路:規定使用者輸入格式 模組名/函式名 通過__import__的形式匯入模組,並通過 hasattr和getattr 檢查並獲取函式返回值。
"""
#通過使用者輸入的形式, 匯入模組
inp = input('請輸入需要匯入的模組名:')
#__import__用於以字串的形式匯入模組
dd = __import__(inp)
#在模組尋找函式並執行函式
inp_func = input('請輸入需要執行的函式:')
#getattr()用於以字串的形式去某個模組中尋找函式
tager_func = getattr(dd,inp_func)
#在獲取到的函式名後加()表示執行函式
result = tager_func()
print(result)

程式碼執行結果:

請輸入需要匯入的模組名:test
請輸入需要執行的函式:f2
我是F2,我被呼叫了

例項:基於反射模擬Web框架路由系統(一)

commons.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def login():
return 'login'

def logout():
return 'logout'

def nb():
return '很牛逼的網頁'

refec_demo.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
基於反射模擬web框架路由系統
"""
from lib import commons
url = input('請輸入模擬的url路徑:')
if url.endswith('login'):
ret = commons.login()
print(ret)
elif url.endswith('logout'):
ret = commons.logout()
print(ret)
else:
print('404')

例項:基於反射模擬Web框架路由系統(二)

refec_demo1.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lib import commons

inp = input('請輸入模擬的url路徑:')
url_inp = inp.split('/')[-1]
if hasattr(commons,url_inp):
ret = getattr(commons,url_inp)
result = ret()
print(result)
else:
print('404')

程式碼實現結果:

路徑正確時結果:

路徑不正確時結果:

例項:基於反射模擬Web框架路由系統(三)

manager.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def home():
return 'Home'

order.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def add_order():
return '新增訂單'

refec_demo2.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#使用者輸入規則:模組名/函式名

url = input('請輸入模組名/函式名:')
target_modul,target_func = url.split('/')
#__import__匯入模組
mod = __import__('lib.' + target_modul,fromlist=True)
#hasattr()判斷函式是否存在
if hasattr(mod,target_func):
ret = getattr(mod,target_func)
result = ret()
print(result)
else:
print('404')

當模組和函式都存在時,url路徑呼叫結果:

當模組和函式都不存在時,url路徑呼叫結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。