反射
利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员(函数),反射
用了一个仿网页的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() 输出: 登录页面 退出页面 主页面