• 根据用户输入的内容,导入模块
#根据用户输入的内容,导入模块
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框架路由系统的更多相关文章

  1. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  2. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  3. Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架

    异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...

  4. 实现基于netty的web框架,了解一下

    上一篇写了,基于netty实现的rpc的微框架,其中详细介绍netty的原理及组件,这篇就不过多介绍 这篇实现基于netty的web框架,你说netty强不强,文中有不对的地方,欢迎大牛指正 先普及几 ...

  5. 基于 CSS 的 Web 框架 CJSS

    CJSS 是一个基于 CSS 的 Web 框架,所有效果都在 CSS 文件中生效,可以在 CSS 中使用它添加更多功能,或者构建一个完整的页面. 使用方法: HTML 想要使用某个组件,在 CSS 文 ...

  6. Python 之反射和普通方式对比(模拟Web框架)

    先模拟一个web页面的选择不同输出不同 vim day8-7.py #!/usr/bin/python # -*- coding:utf-8 -*- import home import accoun ...

  7. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  8. 采用dom4j和反射模拟Spring框架的依赖注入功能

    Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...

  9. 剖析Asp.Net Web API路由系统---WebHost部署方式

    上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...

随机推荐

  1. 2016多校联合训练1 D题GCD (ST表+二分)

    暑假颓废了好久啊...重新开始写博客 题目大意:给定10w个数,10w个询问.每次询问一个区间[l,r],求出gcd(a[l],a[l+1],...,a[r])以及有多少个区间[l',r']满足gcd ...

  2. Codeforces Round #311 (Div. 2)B. Pasha and Tea二分

    B. Pasha and Tea time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  3. bzoj [POI2005]Kos-Dicing 二分+网络流

    [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1835  Solved: 661[Submit][Status][ ...

  4. 使用 html2canvas 实现浏览器截图

    基于上一篇<h5 本地上传图片预览 源码下载>,今天分享一个图片上传后, 根据所上传的图片颜值随机生成一个答案, 并且可以生成一张专属于自己的名片. 首先上传预览我们已经实现了, 所以接下 ...

  5. svn稀疏目录--通过设置工作目录的深度(depth)实现目录树的部分签出

    对于一个大的版本库来说,本地工作目录签出整个目录树是即费时又占地儿的.虽然可以只签出某个子目录树,但有时候还是需要从根目录签出.那么,怎么才能只把自己感兴趣的子目录签出来呢? 从svn1.5版开始,提 ...

  6. Doc常用命令

    1. 获取目录: dir 2. 清屏: cls

  7. J2EE保留小数问题

    如果在前台页面,可以直接使用js的toFixed() 方法.number.toFixed(x)  可把 Number 四舍五入为指定小数位数的数字.参数x :必需.规定小数的位数,是 0 ~ 20 之 ...

  8. 鸽巢排序Pigeonhole sort

    原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序 例如 var pi ...

  9. jsp 安装环境与基本语法

    1.什么是web应用程序? web应用程序是一种可以通过web访问的应用程序.web应用程序的最大好处是用户很容易访问应用程序.用户只需要有浏览器即可,不需要安装其它软件. 2.搭建 java web ...

  10. 【BZOJ4903】【CTSC2017】吉夫特 [DP]

    吉夫特 Time Limit: 15 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行一个整数n. 接下 ...