反射
利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员(函数),反射
用了一个仿网页的get方法实现
commons.py文件
commons.py
def login():
print("登录页面")
def logout():
print("退出页面")
def home():
print("主页面")
index.py文件
import commons # 调用commons模块
def run():
url = input("请输入要访问的url:")
"""
url==字符串类型,如果url==“login”
commons.url() 显然,这样是不对的,因为这样执行commons会去他里面找他是否有url这个函数,如果没有,直接报错
利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员(函数),反射
"""
# setattr()
# delattr()
if hasattr(commons, url): # url==字符串,而现在,url相当于等于一个函数,我们输入的函数,用hasattr去判断是否存在,返回值True或False
func = getattr(commons, url) # 用getattr拿取这个函数,比如url==login,那么也就是说现在(func==commons.login)
func() # 然后我们再来执行以下func,就表示执行commons里面的函数
else:
print("404") # 如果hasattr没有检查到,就执行这句404
if __name__ == ‘__main__‘: # __name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
run()
输出:
请输入要访问的url:login
登录页面
从上面可以看出来,我们只能访问一个模块,如果增加一个模块,我们需要去import里面继续添加,当然,python也想过这个问题,所以import也可以传递字符串
一个小小的测试:
#文件:commons.py
def login():
print("登录页面")
def logout():
print("退出页面")
def home():
print("主页面")
#文件:import_test.py
obj = __import__("commons")
obj.login()
obj.logout()
obj.home()
输出:
登录页面
退出页面
主页面