• 根据用户输入的内容,导入模块
#根据用户输入的内容,导入模块
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. BZOJ3223:文艺平衡树——超详细题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面复制于洛谷. 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写 ...

  2. Educational Codeforces Round 40 F. Runner's Problem

    Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...

  3. TCP中三次握手建立和四次握手释放以及相关问题

    本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...

  4. react设置默认state和默认props

    1.默认状态设置 1.constructor (ES6) constructor(props) { this.state = { n: ... } } 2.getInitialState (ES5) ...

  5. ios轮播

    // // ViewController.m // Ocproject // // Created by wenzhe yi on 2018/2/28. // Copyright © 2018年 we ...

  6. 分析一个贴图社交app的失败原因:FORK(相机)

    FORK(相机)是一个通过分享图片来建立社交的app,它有着鲜明的配色,还算不错的贴图创新,细腻的产品设计,但是由于产品定位不清晰.设计亮点不多以及推广不利,从2014年5月第一版开始就没有火过.所以 ...

  7. 使用freemarker生成word、html时图片显示问题

    使用freemarker生成word.html时图片显示问题 博客分类: Java 使用freemarker生成word时图片显示问题使用freemarker生成html时图片显示问题使用iText生 ...

  8. 获取Web.Config中节点的值

    读取webconfig里面的appSetting和connectionString <appSettings> <add key="SiteURL" value= ...

  9. MongoDB入门(8)- c#通过操作MongoDB GridFS实现文件的数据库存储

    GridFS介绍 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件. GridFS GridFS长啥样 /* 1 */ { "_id" : ObjectId(& ...

  10. 耗子学Python了(2)__Python开发“Hello World”

    一:开发工具 在网上看到的用的开发工具Aptana Studio,我下载的是Aptana_Studio_3_Setup_3.6.1.exe,在安装的过程中啊,出现了各种问题,然后安装后了也出现打不开的 ...