模块讲解----反射 (基于web路由的反射)
一、反射的实际案例:
def main():
menu = '''
1、账户信息
2、还款
3、取款
4、转账
5、账单
''' menu_dic = {
'':account_info,
'':repay,
'':withdraw,
'':transfer,
'':pay_check,
} while True:
print(menu)
user_option = input(">>: ").strip()
if user_option in menu_dic:
menu_dic[user_option]()
反射的总结
1、实例:基于实例来说,就是伪造了web框架的路由系统,即通过一个URL,去定义到某一个模块中的函数上。
2、反射:基于字符串的形式去对象(模块)中,操作其成员。
getattr, delattr,setattr,hasattr
3、扩展:导入模块
import xxx
from xxx import ooo
obj = __import__("xxx")
obj = __import__("xxx.oo.xxx"+m, fromlist=True)
'''
根据用户输入的url不同,调用不同的函数。
调用不同的函数,返回不同页面的内容。
''' def login():
print('炫酷登录页面') def logout():
print('炫酷退出页面') def home():
print('炫酷主页面')
2、index模块:(判读用户输入url的不同,返回不同的结果)
'''
判断用户输入的url的不同,显示不同的结果
''' import commons def run():
inp = input('请输入要访问的url>>>')
if inp == 'login':
commons.login()
elif inp == 'logout':
commons.logout()
elif inp == 'home':
commons.home()
else:
print('') if __name__ == '__main__':
run()
#inp获取到的是字符串类型。 inp = “login”
#commons.inp() != commons.login #回去找inp函数,然后执行
#利用字符串的形式去对象(模块)中,去操作(寻找/检查/删除/设置)成员,反射
getattr(commons,inp)
hasattr(commons,inp)
setattr()
delattr()
反射的使用方法
一、通过反射,寻找/检查模块成员:
import commons def run():
inp = input("请输入要访问的url>>> ") #判断模块中的方法是否存在:
if hasattr(commons,inp): #判读模块内的方法是否存在,如果返回为True则调用。 #获取模块中包含的成员:getattr(模块名,用户输入的url)
func = getattr(commons,inp)
func() else: #如果返回False则打印错误信息 404。
print(404) if __name__ == '__main__':
run()
二、字符串模式的寻找、导入模块:
1、特点:基于web框架的URL路由模式的反射
def run():
inp = input('请输入要访问的rul>>> ') #获取url
m,f = inp.split('/') #将url转换成字符串
obj = __import__(m) #导入字符串中的模块 if hasattr(obj,f): #用内置函数判断字符串中的函数和方法是否存在,
func = getattr(obj,f) #如果存在,就调用字符串中的模块和方法
func() #执行调用方法 else: #如果不存在则打印404
print(404) if __name__ == '__main__':
run() #本地函数调用 显示结果:
请输入要访问的rul>>> commons/db_mgs
炫酷的数据库连接信息:
三、导入同级文件夹下的模块:
1、目录结构:
|day6
--| index.py
-- | lib
--| account.py
--| manager.py
--| commons.py
2、案例:
def run():
inp = input('请输入url路径>>>')
m,f = inp.split('/')
obj = __import__("lib."+m, fromlist=True) if hasattr(obj,f):
func = getattr(obj,f)
func() if __name__ == '__main__':
run() 显示结果:
请输入url路径>>>manger/order
炫酷的订单页面:
练习:
#1、定义函数标题:
#登录&注册
login_register = '''
1、登录
2、注册
3、退出
''' login_register_dic = {
'':'acc_login',
'':'acc_auth',
'':'quit'
} #2、定义函数体
def acc_login():
print('this is login') def acc_auth():
print('This is auth') def quit():
print("This is quit") #3、定义反射条件:
from core import logger
from core import login
from core import menu
def run():
'''
被调用的主接口,主要功能如下:
1、展示登录注册信息
2、通过反射的方式,来实现不同的功能选项,尽量避免过多的if判断
'''
label = menu.login_register
login_reg = menu.login_register_dic
flag = False
while not flag:
print(label)
inp = input("请输入编号:").strip()
if inp in login_reg:
if hasattr(login,login_reg[inp]):
func = getattr(login,login_reg[inp])
func() else:
login_log.error("The input number does not exist, please try again !!!")
反射实例
模块讲解----反射 (基于web路由的反射)的更多相关文章
- Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架
异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...
- C# MVC ( 添加路由规则以及路由的反射机制 )
在项目文件夹下找到 App_Start 下 找到 RouteConfig.cs文件 打开 (1) 约束的规则 从上往下 贪婪性 (2) 用 routes.MapRoute(...) 添加 ...
- Java反射:Web学习的灵魂
反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...
- 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
基于灰度世界.完美反射.动态阈值等图像自动白平衡算法的原理.实现及效果 白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题.白平衡是随着电子影像再现色彩真实 ...
- Hya.io – 基于 Web 的数字音频工作站
Hya.io 是基于 Web 的音频应用程序,通过 Web MIDI ,音频合成器,音序以及大量的插件来支持硬件 MIDI .您可以添加插件到工作区,将其连接到路由音频,进行播放和实验. HYA 支持 ...
- 快速了解Electron:新一代基于Web的跨平台桌面技术
本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...
- c#反射机制学习和利用反射获取类型信息
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- 基于Web在线考试系统的设计与实现
这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973 ...
- 基于Web实现网络拓扑图
想想好像好久没用写博客了! 由于最近想跳槽了(ps:尽管公司挽留,提出一些异与往常的挽留“制度”,But确实已经死心了) ,发现前一段时间一些做Hadoop,和Spark同事时常来请教网络拓扑图的有关 ...
随机推荐
- 各大门户网站全局CSS样式定义
1.网易 body { text-align: center; font-family:"宋体", arial;margin:0; padding:0; background: # ...
- mysql数据库中,查看数据库的字符集(所有库的字符集或者某个特定库的字符集)
需求描述: mysql中,想要查看某个数据库的字符集.通过information_schma模式下的schemata表来查询 环境描述: mysql版本:5.7.21-log 操作过程: 1.查看in ...
- iOS - UITableView滚动到指定的cell并且选中
UITableView //项目中遇到的 - (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)a ...
- poj_3321 线段树/树状数组
题目大意 一个果树(每个节点的分叉数目不固定)上有N个分叉点(包括最末的叶节点),则有N-1条边,将分叉点进行从1到N编号,每个分叉点上均可以结水果.开始的时候,每个分叉点都有一个水果,之后进行一系列 ...
- xcode 4.6 破解及真机调试
从安卓到IOS,从 eclipse 到xcode跨度还是比较大的.在研究的过程中发现,许多时候不仅仅是C,C++,JAVA和OBJECT-C的区别,相对于编程语言来说,操作习惯和开发工具带来的困惑要 ...
- 学习C++服务端一:MySql与C++
mysql学习: http://www.cnblogs.com/cy163/archive/2008/10/16/1312277.html http://developer.51cto.com/art ...
- MyBatis——Java API
Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDB ...
- JavaIO简单代码实例
最近又复习了下JavaIO写了些实例代码都很简单但是能体现大部分方法的用法. IO流实现文件的拷贝 几种不同的方法: package com.wxisme.TestIO; import java. ...
- ORA-28056 解决方法
用pl/sql devlper 来连接oracle数据库,遇到 0RA-28056错误,解决的方法是 在 计算机-->管理 -->事件查看器里边清理应用程序日志(问题原因是应用程序的日志满 ...
- 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay
[BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...