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路徑調用結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM