一、反射的实际案例:

 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. MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测

    ->use Admin         (切换到创建用户) ->db.TestDb          (创建数据库) ->db.addUser(“userName”,”Pwd”)   ...

  2. 记XX2013届优秀毕业生评选(请重视在公司展现自己,重视业绩參评过程,非技术贴)

    本文不是什么技术贴.仅仅是作为一名码农,在公司发展中遇到"參评"中的一个分享,希望对大家有帮助.毕竟,升职加薪这样的事情,你须要自己去争取,须要获得领导和同事的认可.. . .考虑 ...

  3. Java精选笔记_自定义标签

    自定义标签 自定义标签入门 什么是自定义标签 自定义标签可以有效地将HTML代码与Java代码分离,从而使不懂Java编程的HTML设计人员也可以编写出功能强大的JSP页面 JSP规范中定义了多个用于 ...

  4. K - problem 问题

    Leetcode 有几个题目, 分别是 2sum, 3sum(closest), 4sum 的求和问题和 single Number I II, 这些题目难点在于用最低的时间复杂度找到结果 2-sum ...

  5. Python 入门(四)List和Tuple类型

    创建list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  6. 应用程序挂起、复原与终止— IOS开发

    本文转载至 http://justcoding.iteye.com/blog/1473350 一.挂起 当有电话进来或者锁屏,这时你的应用程会挂起,在这时,UIApplicationDelegate委 ...

  7. c++11——lambda表达式

    lambda表达式 函数式编程的一个语法,有如下优点: (1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.以更直接的方式写程序,好的可读性和可维护性. (2) ...

  8. MongoDB复制集原理

    版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...

  9. Android Processes and Threads

    Processes and Threads When an application component starts and the application does not have any oth ...

  10. LINUX IPTABLES 防火墙配置

     0.iptables(ACL)的匹配原则: 与cisco等一致,从上到下依次匹配. 1.iptables的基本用法:. (1)命令格式 iptables [–ttable] command [mat ...