# 何为反射?
# 以字符串形式去操作模块(对象)以及其中的成员方法。
# 利用字符串的形式去对象中寻找操作(寻找/检查/删除/设置)成员
# hasattr() getattr() setattr() delattr()
# 理论:以字符串形式去操作(操作包括寻找,获取,设置,删除等等)模块(对象)以及其中的成员方法。 # 概念: # hasattr() 根据字符串去对象中寻找是否存在其映射的方法。 # hasattr(obj,input_str) # getattr() 根据字符串去对象中寻找方法的内存地址。 # getaatr(obj,input_str) # setattr() 根据字符串去对象中创建对应的方法。 # setattr(obj,input_str,your_fun) # delattr() 根据字符串删除对应的方法。 # delattr(obj,input_str) # __import__() 以字符串寻找模块。 class Person(object): def wrok(self): print('工作了....') def eat(self): print('吃饭了....') def talk(self): print('在说话....') def my_func(self): """自定义方法""" print('自定义方法') while True: input_str = input('<<:').strip() if input_str == 'exit': break if hasattr(Person,input_str): func = getattr(Person,input_str) func(Person) elif input_str == 'name': """设置一个属性name""" setattr(Person,input_str,'豆腐') print(getattr(Person,input_str)) else: """如果不存在则在对象中添加方法""" setattr(Person,input_str,my_func) func = getattr(Person,input_str) func(Person)
# __import__() 以字符串寻找模块。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
def person(): print('person') def home(): print('home') def index(): print('index') def auth(): print('auth')
import importlib def run(): """ 简单的web路由练习小程序 根据字符导入模块,操作其中的方法 """ input_str = input('请输入url:').strip() models,action = input_str.split('/') obj = importlib.import_module(models) # 判断是否导入该模块,官方推荐使用 #obj = __import__(models,fromlist=True) # 判断是否导入该模块,fromlist=True ,导入多级目录的模块 if obj: attr = hasattr(obj,action) if attr: func = getattr(obj,action) func() else: print('404') else: print('404') while True: run()
执行结果如下: