第四十九,反射基本介紹

反射最初理解1python

經過字符串的形式,導入模塊2框架

咱們前面講到的導入模塊,都是import 模塊名稱  如:import mk   這種方式導入的3函數

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import mk #導入mk模塊
a = mk.dlu() #運行模塊裏的函數
print(a) #執行函數
# 輸出
# 用戶登陸
# None

 

若是模塊名稱是字符串類型,則沒法導入模塊4url

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import "mk" #導入mk模塊
a = mk.dlu() #運行模塊裏的函數
print(a) #執行函數
# 輸出
#   File "H:/py/index.py", line 3
#     import "mk" #導入mk模塊
#               ^
# SyntaxError: invalid syntax

因此要想模塊是字符串類型導入模塊,有另外的一種方式spa

 

__import__()接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱5code

使用方法1:模塊名稱變量 = __import__("模塊文件名稱")orm

使用方法2:若是模塊在多層文件夾下:模塊名稱變量 = __import__("模塊路徑到模塊文件名稱")對象

格式1:a = __import__("mk")blog

格式2:a = __import__("lib.ska.mk",fromlist=True)索引

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
a.dlu() #執行模塊下的dlu()函數

若是模塊在多層文件夾下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("lib.ska.mk",fromlist=True) #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
b = a.dlu()#執行函數
print(b)#打印函數返回值
# 輸出
# 用戶登陸
# None

 

 

經過字符串的形式,去模塊中尋找指定函數,或者全局變量,並執行6

getattr()內置函數,到指定模塊查找指定函數或者指定全局變量,並賦值給一個變量,若是找到的是函數賦值變量加()括號等於執行函數,若是找到的是全局變量賦值變量就等於全局變量值7

使用方法:賦值變量 = getattr(模塊名稱, "字符串形式函數名稱或變量名稱", 若是沒找到默認返回值)

格式:f = getattr(a,"dlu",None)

字符串形式查找函數

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
"""經過字符串的形式,去模塊中尋找指定函數或者全局變量,並執行"""
f = getattr(a,"dlu",None) #getattr()內置函數,到指定模塊查找指定函數或者指定全局變量,並賦值給一個變量,若是找到的是函數賦值變量加()括號等於執行函數,若是找到的是全局變量賦值變量就等於全局變量值
f()

 

 字符串形式查找全局變量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
"""經過字符串的形式,去模塊中尋找指定函數或者全局變量,並執行"""
f = getattr(a,"ASDF",None) #getattr()內置函數,到指定模塊查找指定函數或者指定全局變量,並賦值給一個變量,若是找到的是函數賦值變量加()括號等於執行函數,若是找到的是全局變量賦值變量就等於全局變量值
print(f) #打印全局變量

 

hasattr()內置函數,到指定模塊查找指定函數或者指定全局變量,若是找到指定函數或者全局變量返回True,不然返回False7

使用方法:賦值變量 = hasattr(模塊名稱, "字符串形式函數名稱或變量名稱")

格式:f = hasattr(a,"ASDF")

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
"""內置函數,到指定模塊查找指定函數或者指定全局變量"""
f = hasattr(a,"ASDF") #hasattr()內置函數,到指定模塊查找指定函數或者指定全局變量,若是找到指定函數或者全局變量返回True,不然返回False
print(f) #打印全局變量
# 輸出
# True

 

setattr()內置函數,爲模塊在內存裏添加全局變量或者函數8

使用方法:setattr(模塊名稱, "字符串形式函數名稱或變量名稱",全局變量值或lambda表達式)

格式:setattr(a,"MF","8796")

爲模塊添加全局變量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
"""內置函數,爲模塊在內存裏添加全局變量或者函數"""
setattr(a,"MF","8796") #setattr()內置函數,爲模塊在內存裏添加全局變量或者函數
g = getattr(a,"MF",None) #到模塊查找到添加的MF全局變量
print(g)#打印出添加的全局變量
# 輸出
# 8796

爲模塊添加函數

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
"""內置函數,爲模塊在內存裏添加全局變量或者函數"""
setattr(a,"f1",lambda b,c: b + c) #setattr()內置函數,爲模塊在內存裏添加全局變量或者函數
f1 = getattr(a,"f1",None) #到模塊查找到添加的f1()函數
sfg = f1(1,2) #執行f1函數並傳值
print(sfg)#打印出函數的執行結果
# 輸出
# 3

 

delattr()內置函數,刪除模塊在內存裏的函數或者全局變量9

使用方法:delattr(模塊名稱, "字符串形式函數名稱或變量名稱")

格式:delattr(a,"dlu")

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串類型的模塊名,導入mk模塊"""
a = __import__("mk") #接收字符串類型的模塊名稱,到程序目錄找到對應模塊文件導入模塊,賦值給一個變量,此變量等於從新定義模塊名稱
"""內置函數,刪除模塊在內存裏的函數或者全局變量"""
b = hasattr(a,"dlu") #到指定模塊查找指定函數或者指定全局變量,若是找到指定函數或者全局變量返回True,不然返回False
print(b) #打印返回值True,說明模塊裏有dlu()函數

delattr(a,"dlu") #delattr()內置函數,刪除模塊在內存裏的函數或者全局變量

c = hasattr(a,"dlu") #到指定模塊查找指定函數或者指定全局變量,若是找到指定函數或者全局變量返回True,不然返回False
print(c) #打印返回值False,說明模塊內存裏已經刪除了這個函數
# 輸出
# True
# False

 

反射總結:10
根據字符串的形式去某個對象(模塊)中尋找指定的函數或者全局變量
根據字符串的形式去某個對象(模塊)中判斷指定的函數或者全局變量是否存在
根據字符串的形式去某個對象(模塊)中設置指定的全局變量或者函數
根據字符串的形式去某個對象(模塊)中刪除指定的函數或者全局變量

反射的意義:根據字符串的形式去對象(模塊)中操做其成員11

 

基於反射模擬Web框架路由系統,根據用戶請求的url地址後綴,獲取後綴名稱,到指定模塊查找執行後綴對應的函數12

函數模塊

#!/usr/bin/env python
# -*- coding:utf8 -*-
def shou():
    print("首頁")

def gong():
    print("公司簡介")

def chp():
    print("產品展現")

def liou():
    print("留言板")

判斷頁面

"""根據用戶請求的url地址後綴,獲取後綴名稱,到指定模塊執行後綴對應的函數"""
url = "www.jxiou.com/liou"
a = url.split("/") #根據/分割域名字符串,返回列表
b = a[len(a)-1] #獲取列表的元素個數,在索引出域名後綴

from lib.ska import mk #導入模塊
if hasattr(mk,b): #判斷指定模塊裏是否有後綴函數
    c = getattr(mk,b) #若是有後綴函數,找到後綴函數賦值給一個變量
    print(c()) #執行打印後綴函數
else: #若是模塊裏沒有後綴函數,打印404
    print("404")

 

基於反射模擬Web框架路由系統,根據用戶請求的url地址後綴,獲取後綴模塊名稱和後綴函數名稱,查找到指定模塊下的指定函數並執行函數13

也就是根據url地址提供的模塊名稱和函數名稱,查找到對應的模塊,和模塊下對應的函數執行

 函數模塊1

#!/usr/bin/env python
# -*- coding:utf8 -*-
def shou():
    print("首頁")

def gong():
    print("公司簡介")

def chp():
    print("產品展現")

def liou():
    print("留言板")

 函數模塊2

#!/usr/bin/env python
# -*- coding:utf8 -*-
def hout():
    print("後臺首頁")

def houd()
    print("後臺訂單")

判斷頁面1

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""根據用戶請求的url地址後綴,獲取後綴模塊名稱和後綴函數名稱,到指定模塊執下找到指定函數並執行函數"""
url = "www.jxiou.com/mk/gong"
a = url.split("/") #根據/分割域名字符串,返回列表
b = a[len(a)-1] #獲取後綴函數名
c = a[len(a)-2] #獲取後綴模塊名

d = __import__("lib.ska.{}".format(c),fromlist=True) #根據url模塊名稱找到模塊
if hasattr(d,b): #判斷url函數在url模塊裏是否存在
    liou = getattr(d,b) #若是存在,找到函數賦值給一個變量
    print(liou()) #執行打印變量
else: #若是不存在404
    print("404")

# 輸出
# 公司簡介
# None

判斷頁面2

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""根據用戶請求的url地址後綴,獲取後綴模塊名稱和後綴函數名稱,到指定模塊執下找到指定函數並執行函數"""
url = "www.jxiou.com/hou/houd"
a = url.split("/") #根據/分割域名字符串,返回列表
b = a[len(a)-1] #獲取後綴函數名
c = a[len(a)-2] #獲取後綴模塊名

d = __import__("lib.ska.{}".format(c),fromlist=True) #根據url模塊名稱找到模塊
if hasattr(d,b): #判斷url函數在url模塊裏是否存在
    liou = getattr(d,b) #若是存在,找到函數賦值給一個變量
    print(liou()) #執行打印變量
else: #若是不存在404
    print("404")

# 輸出
# 後臺訂單
# None
相關文章
相關標籤/搜索