python_基于反射模拟Web框架路由系统

  • 根据用户输入的内容,导入模块
#根据用户输入的内容,导入模块
inp = input("请输入模块名: ")
print(inp,type(inp))

dd = __import__(inp)
r = dd.f1()
print(r)

inp = input('请输入模块:')
inp_func = input('请输入要执行的函数:')

#_-import__用于以字符串的形式导入模块
dd = __import__(inp)
  • 以字符串的形式去某个模块中寻找函数
 1 #getattr 用于以字符串的形式去某个模块中寻找函数
 2 target_func =  getattr(dd,inp_func,None)
 3 #在获取到的函数名后加()表示执行函数
 4 #result = target_func()
 5 print( target_func)
 6 
 7 import commo
 8 
 9 #判断函数是否存在
10 r = hasattr(commo,'AGE')
11 print(r)
12 
13 #设置函数
14 setattr(commo,'AGE',lambda a:a+1)
15 r = hasattr(commo,'AGE')
16 print(r)
17 
18 #删除成员
19 delattr(commo,'NAME')
20 r = hasattr(commo,'NAME')
21 print(r)
  • 导入模块扩展方法:

方法1、import 模块

方法2、a = __import__(“模块名”)

方法3、 a = __import__(‘lib.test.com’,fromlist=True)

方法举例:

 1 #index.py
 2 from lib import account
 3 
 4 url = input("请输入url: ")
 5 if url.endswith("login"):
 6     a = account.login()
 7     print(a)
 8 elif url.endswith('logout'):
 9     b = account.logout()
10     print(b)
11 elif url.endswith('nb'):
12     c = account.nb()
13     print(c)
14 else:
15     print("404")
16 
17 
18 #account.py
19 def login():
20     return "login"
21 
22 def logout():
23     return "logout"
24 
25 def nb():
26     return "牛逼网页"
27 
28 输出结果:
29 请输入url: www.hao.com/nb
30 牛逼网页
方法一
  • 方法二目录结构如下:

1 url = input("请输入url: ")
2 inp = url.split('/')[-1]
3 if hasattr(account,inp):
4     target_func = getattr(account,inp)
5     r = target_func()
6     print(r)
7 else:
8     print('404')
进一步优化方法二
  • 方法三目录结构,多模块目录结构情况下进行动态导入模块,如下:

 1 #模块名/函数名
 2 url = input("请输入url: ")
 3 
 4 target_module,target_func = url.split('/')
 5 m = __import__("lib." + target_module,fromlist=True)
 6 
 7 if hasattr(m,target_func):
 8     target_func = getattr(m,target_func)
 9     r = target_func()
10     print(r)
11 else:
12     print('404')
13 
14 
15 输出结果:
16 请输入url: order/add_order
17 添加订单
再进一步优化方法三
  •  利用反射查看面向对象成员归属
 1 class Annimal:
 2     def __init__(self):
 3         print("父类构造方法")
 4         self.ty = "动物"
 5     def eat(self):
 6         print("%s%s在吃东西" % (self.name,self.n))
 7 
 8 class Cat(Annimal):
 9     def __init__(self,name):
10         print("子类构造方法")
11         self.name = name
12         self.n = ""
13         super(Cat,self).__init__() #常用第一种方法,执行父类初始化数据
14         #Annimal.__init__(self) #第二种方法
15 
16 #数据初始化
17 c = Cat("张三的")
18 c.eat()
19 print(c.__dict__)
20 
21 #反射:对象,即可以找对象,又可以找类的成员
22 r1 = hasattr(c,'eat')
23 print(r1)
24 r2 = hasattr(c,'name')
25 print(r2)
  • 利用反射导入模块、查找类、创建对象、查找对象中的成员
 1 #!/usr/bin/env python
 2 #coding=utf-8
 3 __author__ = 'yinjia'
 4 
 5 #test3.py
 6 class Foo:
 7     def __init__(self,name):
 8         temp = "xxx"
 9         self.name = name
10 
11     def show(self):
12         print('show')
 1 #!/usr/bin/env python
 2 #coding=utf-8
 3 __author__ = 'yinjia'
 4 
 5 #test4.py
 6 #导入模块
 7 m = __import__("test3",fromlist=True)
 8 
 9 #去模块中找类
10 class_name = getattr(m,"Foo")
11 
12 #根据类创建对象
13 obj = class_name("Yinjia")
14 
15 #去对象中找name对应的值
16 val = getattr(obj,'name')
17 print(val)
原文地址:https://www.cnblogs.com/yinjia/p/8605663.html