一、反射的实际案例:

 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)

基础环境:
1、假如有个网页,需要根据用户输入的不同的url路径来展现,不同的页面内容。
2、定义两个模块:commons  index
 
1、commons模块:(模拟不同功能的页面函数)
 '''
根据用户输入的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()
问题:
1、以上是一个网站的三个函数,也是三个页面功能。
2、现实中,一个网站中有多个页面(成百上千个函数),来处理用户的请求。
3、用户访问很多的页面,访问页面越多,那处理访问请求的函数就不一样。
 
解决方法:
1、在commons模块中要定义好多个页面功能函数,这个不变有多少定义多少。
2、在index中,无需多个if判断,只需要将用户输入的input值,自动匹配commons模块里的函数就OK了。
 
修改方法如下:
inp = input(’请输入要访问的url>>> ‘)
 #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路由模式的反射

2、用途:用户输入的url路径转成字符串的格式,然后调用相应的模块名和方法:
例如:account/login
 
3、分析:该需求分为2部分:
第一部分是:将用户输入的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
炫酷的数据库连接信息:

三、导入同级文件夹下的模块:

注意:__import__:在默认的时候只导入lib.xx的点前面那个lib模块;
解决方法:需要用字符串拼接("目录名." + 模块名)
                 后参数(fromlist=True)

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路由的反射)的更多相关文章

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

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

  2. C# MVC ( 添加路由规则以及路由的反射机制 )

    在项目文件夹下找到 App_Start 下 找到 RouteConfig.cs文件 打开   (1) 约束的规则 从上往下 贪婪性   (2) 用 routes.MapRoute(...) 添加   ...

  3. Java反射:Web学习的灵魂

    反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...

  4. 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果

    基于灰度世界.完美反射.动态阈值等图像自动白平衡算法的原理.实现及效果      白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题.白平衡是随着电子影像再现色彩真实 ...

  5. Hya.io – 基于 Web 的数字音频工作站

    Hya.io 是基于 Web 的音频应用程序,通过 Web MIDI ,音频合成器,音序以及大量的插件来支持硬件 MIDI .您可以添加插件到工作区,将其连接到路由音频,进行播放和实验. HYA 支持 ...

  6. 快速了解Electron:新一代基于Web的跨平台桌面技术

    本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...

  7. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  8. 基于Web在线考试系统的设计与实现

    这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973   ...

  9. 基于Web实现网络拓扑图

    想想好像好久没用写博客了! 由于最近想跳槽了(ps:尽管公司挽留,提出一些异与往常的挽留“制度”,But确实已经死心了) ,发现前一段时间一些做Hadoop,和Spark同事时常来请教网络拓扑图的有关 ...

随机推荐

  1. Neo4j简单的样例

    系统环境: Ubuntu 04.10 x64 一:安装 下载最新版:neo4j-community-2.2.3-unix.tar.gz  解压 cd neo4j-community-2.2.3/bin ...

  2. BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度

    题目大意:定义一棵深度为d的严格n元树为根的深度为0,最深的节点深度为d,且每一个非叶节点都有恰好n个子节点的树 给定n和d,求深度为d的严格n元树一共同拥有多少种 此题的递推部分并不难 首先我们设深 ...

  3. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  4. ionic简单路由及页面传参

    1)页面跳转及传参方法 angular.module('app.routes', [])//routes路由模型 .config(function($stateProvider, $urlRouter ...

  5. Python 进阶(三)面向对象编程基础

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkMAAAFGCAIAAADmfgziAAAgAElEQVR4nOx993vT1v7/93/5EEt2Eg

  6. win8.1简单快速安装phpnow的方法

    工具/原料 phpnow 1.5.6 管理员身份登陆系统 方法/步骤   下载phpnow 这是必须的,大家可以自行百度下载,然后我们将phpnow放到一个文件夹,可以是根目录,也可以不是,但一定要知 ...

  7. java基础---->java中变参函数的使用

    Java的变参函数实现实际上参数是一个数组,今天我们就简单的学习一下它的用法. java中的变参函数 一.它的使用方法如下: public class VariableParam { private ...

  8. window.postMessage跨文档通信

    window.postMessage 1.浏览器兼容情况:IE8+.chrome.firefox等较新浏览器都至此. 2.使用方法: a.otherWindow.postMessage( messag ...

  9. Hibernate插入、查询、删除操作 HQL

    Hibernate的所有的操作都是通过Session完成的. 基本步骤如下: 1:通过配置文件得到SessionFactory: SessionFactory sessionFactory=new C ...

  10. js的delete和void关键字

    delete关键字   delete关键字的作用: 删除对象的属性 语法:delete 对象.属性 可以删除没有使用var关键字声明的全局变量(直接定义在window上面的属性) delete关键字的 ...