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)
以字符串的形式去某个模块中寻找函数
#getattr 用于以字符串的形式去某个模块中寻找函数
target_func = getattr(dd,inp_func,None)
#在获取到的函数名后加()表示执行函数
#result = target_func()
print( target_func) import commo #判断函数是否存在
r = hasattr(commo,'AGE')
print(r) #设置函数
setattr(commo,'AGE',lambda a:a+1)
r = hasattr(commo,'AGE')
print(r) #删除成员
delattr(commo,'NAME')
r = hasattr(commo,'NAME')
print(r)
- 导入模块扩展方法:
方法1、import 模块
方法2、a = __import__(“模块名”)
方法3、 a = __import__(‘lib.test.com’,fromlist=True)
方法举例:
#index.py
from lib import account url = input("请输入url: ")
if url.endswith("login"):
a = account.login()
print(a)
elif url.endswith('logout'):
b = account.logout()
print(b)
elif url.endswith('nb'):
c = account.nb()
print(c)
else:
print("") #account.py
def login():
return "login" def logout():
return "logout" def nb():
return "牛逼网页" 输出结果:
请输入url: www.hao.com/nb
牛逼网页
方法一
- 方法二目录结构如下:

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

#模块名/函数名
url = input("请输入url: ") target_module,target_func = url.split('/')
m = __import__("lib." + target_module,fromlist=True) if hasattr(m,target_func):
target_func = getattr(m,target_func)
r = target_func()
print(r)
else:
print('') 输出结果:
请输入url: order/add_order
添加订单
再进一步优化方法三
- 利用反射查看面向对象成员归属
class Annimal:
def __init__(self):
print("父类构造方法")
self.ty = "动物"
def eat(self):
print("%s%s在吃东西" % (self.name,self.n)) class Cat(Annimal):
def __init__(self,name):
print("子类构造方法")
self.name = name
self.n = "猫"
super(Cat,self).__init__() #常用第一种方法,执行父类初始化数据
#Annimal.__init__(self) #第二种方法 #数据初始化
c = Cat("张三的")
c.eat()
print(c.__dict__) #反射:对象,即可以找对象,又可以找类的成员
r1 = hasattr(c,'eat')
print(r1)
r2 = hasattr(c,'name')
print(r2)
- 利用反射导入模块、查找类、创建对象、查找对象中的成员
#!/usr/bin/env python
#coding=utf-8
__author__ = 'yinjia' #test3.py
class Foo:
def __init__(self,name):
temp = "xxx"
self.name = name def show(self):
print('show')
#!/usr/bin/env python
#coding=utf-8
__author__ = 'yinjia' #test4.py
#导入模块
m = __import__("test3",fromlist=True) #去模块中找类
class_name = getattr(m,"Foo") #根据类创建对象
obj = class_name("Yinjia") #去对象中找name对应的值
val = getattr(obj,'name')
print(val)
python_基于反射模拟Web框架路由系统的更多相关文章
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架
异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...
- 实现基于netty的web框架,了解一下
上一篇写了,基于netty实现的rpc的微框架,其中详细介绍netty的原理及组件,这篇就不过多介绍 这篇实现基于netty的web框架,你说netty强不强,文中有不对的地方,欢迎大牛指正 先普及几 ...
- 基于 CSS 的 Web 框架 CJSS
CJSS 是一个基于 CSS 的 Web 框架,所有效果都在 CSS 文件中生效,可以在 CSS 中使用它添加更多功能,或者构建一个完整的页面. 使用方法: HTML 想要使用某个组件,在 CSS 文 ...
- Python 之反射和普通方式对比(模拟Web框架)
先模拟一个web页面的选择不同输出不同 vim day8-7.py #!/usr/bin/python # -*- coding:utf-8 -*- import home import accoun ...
- django框架--路由系统
目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...
- 采用dom4j和反射模拟Spring框架的依赖注入功能
Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...
随机推荐
- BZOJ1036:[ZJOI2008]树的统计——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来 ...
- HDU3652:B-number——题解
http://acm.hdu.edu.cn/showproblem.php?pid=3652 题目大意:给一个数n,求1-n所有满足下列条件的数的个数: 1.包含一个子串为“13” 2.能被13整除. ...
- HDOJ.1789 Doing Homework again (贪心)
Doing Homework again 点我挑战题目 题意分析 给出n组数据,每组数据中有每份作业的deadline和score,如果不能按期完成,则要扣相应score,求每组数据最少扣除的scor ...
- js实现游戏转盘抽奖
<!DOCTYPE html> <html> <head> <title>js抽奖</title> <meta charset=&qu ...
- 页面自适应<meta name="viewport">标签设置
viewport: 它在页面中设置,是应对手机模式访问网站.网页对屏幕而做的一些设置.通常手机浏览器打开页面后,会把页面放在一个虚拟的“窗 口”–这个比窗口大,也就是你常发现页面可以进行拖动.放大放小 ...
- lombok 配置使用以及优势
maven依赖 <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> ...
- UVA 1363 Joseph's Problem
https://vjudge.net/problem/UVA-1363 n 题意:求 Σ k%i i=1 除法分块 如果 k/i==k/(i+1)=p 那么 k%(i+1)=k-(i+1)*p= k ...
- MyBatis框架的使用及源码分析(七) MapperProxy,MapperProxyFactory
从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过Ma ...
- Java面试知识总结三
1.SpringMVC在项目中的应用? 1)service层,项目的业务逻辑层,一般先定义一个接口,在写一个实现类,实现所有的接口方法.service的实现类中要加注解@Service(用于标注业务层 ...
- 51nod 1806 wangyurzee的树
基准时间限制:1 秒 空间限制:131072 KB wangyurzee有n个各不相同的节点,编号从1到n.wangyurzee想在它们之间连n-1条边,从而使它们成为一棵树.可是wangyur ...