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的路由系统内部是怎样实现的.还是以一个简单实例开 ...
随机推荐
- React ref的用法
React的ref有3种用法: 1. 字符串(已废弃)2. 回调函数3. React.createRef() (React16.3提供) 1. 字符串 最早的ref用法. 1.dom节点上使用,通过t ...
- redux样板代码简化写法
直接使用redux,要写很多样板代码,大量的actiontype,actionCreator.一个异步的方法要写三个actiontype,三个actionCreator,十分繁琐.下面是本人使用的一种 ...
- 警惕!Unity3D中UnityEngine.Object的一个小陷阱
先看看如下C#的脚本代码: 猜猜控制台打出来的是什么? In the bool parameter function, value info is: True 肯定出乎很多人的意料吧? transf ...
- 背景建模技术(五):视频捕获(VideoCapture)模块
本次对“视频捕获(VideoCapture)模块”做出分析,给出源代码和对应的程序流程框架. 视频捕获模块的主要功能是设置视频或相机参数,并读取设置配置参数,最后进入帧处理模块的process进程,该 ...
- Aidl实现进程间通信,跨进程回调
aidl支持的文件类型 1. Java 编程语言中的基本类型, 如 int.long.boolean 等, 不需要 import. 2. String.List.Map 和 CharSequence, ...
- bzoj 1132 [POI2008]Tro 几何
[POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1796 Solved: 604[Submit][Status][Discu ...
- [技巧篇]03.关于MyBatis的简单批量处理
- nodejs与mongo
1.连接URL (使用数据用户名与密码连接或不使用连接数据库) npm install mongodb --save var mon = require('mongodb').MongoClient; ...
- springboot线程池@Async的使用和扩展
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 本 ...
- Bzoj4870 [SXOI2017]组合数问题
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 155 Solved: 78 Description Input 第一行有四个整数 n, p, k, ...