#!/usr/bin/env python#-*- coding: utf-8 -*-
'''反射:利用字符串去对象中操作成员'''
'''案例:
根据字符串到模块中执行模块中函数名与字符串一致的函数(以字符串的形式执行函数)
#下面所有操作都是基于内存的,setattr、delattr不会对对象造成影响
hasattr() 判断对象中是否存在成员
getattr() 从对象中查找成员
setattr() 在对象中设置(添加)成员
delattr() 从对象中删除成员
import commons
def run():
s = input("请输入要执行的函数名:")
#if s == 'login':
# commons.login()
#elif s == 'logout':
# commons.logout()
#elif s == 'home':
# commons.home()
#else:
# print('404')
#如果要手动进行判断输入的字符串对应的模块中的函数名,要写很长。要想很简单的就找到函数,可以用反射
if hasattr(commons,s): #判断commons模块中是否存在函数名与字符串s一致的函数,有则返回True
func = getattr(commons,s) #从commons模块中查找函数名与字符串s一致的函数
func() #执行函数
else:
print('404')
if __name__ == '__main__':
run()'''
'''案例2:
以字符串的形式导入模块
__import__() #导入模块,括号内是字符串 =====》也可以使用importlib模块
注意:
如果是导入其他目录下的模块,如:__import__('lib.commons'),默认情况下只会导入lib,而不是导入commons,要想导入完整,
需要添加参数:__import__('lib.commons',fromlist=True),这样就可以导入完整'''
defrun():
s= input('请输入url:') #commons/login形式
m,f = s.split('/')
obj= __import__(m)ifhasattr(obj,f):
func=getattr(obj,f)
func()else:print(404)if __name__ == '__main__':
run()