反射
通过字符串的形式导入模块,
通过字符串的形式去模块中寻找指定函数,全局变量,并执行
根据字符串的形式去某个模块中寻找东西
总结:根据字符串的形式去某个对象(某个模块)中操作成员
# import commons
# getattr 用于以字符串的形式导入模块
inp = input("请输入要导入的模块:")
dd = __import__(inp)
inp_func = input("请输入要执行的函数:")
# r = commons.f1()
target_func = getattr(dd, inp_func)
result = target_func() # 执行函数
print(result)
# commons.py 模块
NAME = "xinmin"
def f1():
return "F1"
def f2():
return "F2"
def f3():
return "F3"
import commons
# 第三个参数表示没找到的时候的默认返回值
target_func = getattr(commons, "f1", None)
# 判断是否存在
r = hasattr(commons, "NAME")
print(r) # True
# 在内存中为模块添加东西(全局变量,函数)
setattr(commons, "AGE", 18)
# 在内存中出删除模块中的东西,不影响源文件
delattr(commons, "f2")
# 导入模块
import commons
# dd = __import__("commons")
# 嵌套关系
import lib.test.com
# from lib.test import com
# fromlist = True 去找模块
# r = __import__("lib.test.com", fromlist = True)
# print(r)
# 反射小案列
# account.py模块
def login():
return "login"
def logout():
return "logout"
def nb():
return "特别牛逼的页面"
# ================================================
# index.py 模块
# 版本一
"""
from lib import account
url = input("请输入url:")
if url.endswith("login"):
r = account.login()
print(r)
elif url.endswith("logout"):
r = account.logout()
print(r)
elif url.endswith("nb"):
r = account.nb()
print(r)
else:
print("404")
"""
# 版本二
"""
from lib import account
url = input("请输入url:")
# 使用反射简化if-else的应用
inp = url.split("/")[-1]
if hasattr(account, inp):
target_func = getattr(account, inp)
r = target_func()
print(r)
else:
print("404")
"""
# 版本三
# 模块名/函数名
# account/login
url = input("请输入url:")
target_module, target_func = url.split("/")
m = __import__("lib." + target_module, fromlist=True)
if hasattr(m, target_func):
target_func = getattr(m, target_func)
r = target_func()
print(r)
else:
print("404")
网友评论