反射最初理解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