Python 之反射和普通方式对比(模拟Web框架)
先模拟一个web页面的选择不同输出不同
vim day8-7.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import home
import account
print 'oldboy...' url = raw_input('url:')
if url == 'home/dev':
ret = home.dev()
print ret
elif url == 'home/index':
ret = home.index()
print ret
elif url == 'account/login':
ret = account.login()
print ret
elif url == 'account/logout':
ret = account.logout()
print ret
else:
print '404'
vim home.py
def index():
return 'home.index'
def dev():
return 'home.dev'
~
vim account.py
def login():
return 'account.login' def logout():
return 'account.logout'
执行输入不同的会出现不同的结果,输入不对则返回404

如果针对一个网站所有的页面都通过这种方法来判断代码将会很长也不合理
可以使用mvc框架
models 数据库
views html模板
controllers 逻辑处理
修改代码vim day8-8.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import home
import account
print 'oldboy...' url = raw_input('url:')
#url == 'home/dev'
controller,action = url.split('/')
#action = 字符串
#去某容器中,找函数,字符串函数名,如果有,则获取函数
func = getattr(home,action)
ret = func()
print ret
当home新加了功能只需要修改home.py无需修改调用这个模块的主函数,第二种方法比第一种方法更加简洁
PS:反射是以字符串的形式导入模块并且以字符串的形式执行这个模块里面的函数
一个web框架
vim day8-9.py
#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server class Handler(object): def index(self):
return 'index' def news(self):
return 'news' def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
ret = func()
return ret
else:
return '404 not found' if __name__ == '__main__':
httpd = make_server('', 8001, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()
运行程序的同时在web端输入


输入index和news输出,否则输出404
反射有以下几个内置函数
hasattr 是否存在方法,如存在返回True否则返回False
getattr 调用方法
setattr 设置方法
delattr 删除方法
PS:其中hasattr和getattr常用
vim day8-10.py
import home
print dir(home)
print hasattr(home,'dev')
print getattr(home,'dev')
setattr(home,'alex','gentle man')
print getattr(home,'alex')
print dir(home)

PS:反射通过以上四种方法操作内存中某个容器中的元素,一旦reload将重新加载原始文件内容
反射操作类和对象中的的成员
vim day8-11.py
#!/usr/bin/env python
#coding:utf-8 class Foo:
static_name = 'nba'
def __init__(self):
self.name = 'alex' def show(self):
pass @staticmethod
def static_show():
pass @classmethod
def class_show(cls):
pass #obj = Foo() print Foo.__dict__.keys() #查看类里面的成员['static_show', '__module__', 'show', 'static_name', 'class_show', '__doc__', '__init__']
print hasattr (Foo,'static_show') #是否含有有的话返回True
obj = Foo()
print obj.__dict__ #查看对象的成员只有一个{'name': 'alex'}
print hasattr(obj,'name') #hasattr查看对象里面是否有name
print hasattr(obj,'show') #对象的特殊性,如果在对象里面找不到会去创建对象的类里面找所以返回True

反射操作多层嵌套成员
调用类里面的方法
vim day8-12.py
import home cls = getattr(home,'Foo')
print cls
s_name = getattr(cls,'static_name')
print s_name
home.py内容为

执行结果

动态模块导入
vim day8-13.py
#!/usr/bin/env python
#coding:utf-8 controller,action = raw_input('url:').split('/') #home
module = __import__(controller)
func = getattr(module,action)
ret = func()
print ret
Python 之反射和普通方式对比(模拟Web框架)的更多相关文章
- Python开发【第二十一篇】:Web框架之Django【基础】
Python开发[第二十一篇]:Web框架之Django[基础] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...
- Ubuntu16.04采用FastCGI方式部署Flask web框架
1 部署nginx 1.1 安装nginx服务 root@desktop:~# apt-get install nginx -y 1.2 验证nginx服务是否启动 root@des ...
- 【Python之路】第十六篇--Web框架之Tornado
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- python运维开发(十七)----jQuery续(示例)web框架django
内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...
- Python开发【第十八篇】Web框架之Django【基础篇】
一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...
- python开发学习-day15(前端部分知识、web框架、Django创建项目)
s12-20160430-day15 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- 【Python之路】第十五篇--Web框架
Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...
- python_基于反射模拟Web框架路由系统
根据用户输入的内容,导入模块 #根据用户输入的内容,导入模块 inp = input("请输入模块名: ") print(inp,type(inp)) dd = __import_ ...
- python的反射机制
转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...
随机推荐
- python Thread对象的setDaemon(True)的作用。
1.如果主线程是永远都不会结束的,那设置一个线程为守护线程是没必要的,设不设置都一样. 2.什么时候需要设置为守护线程?如果希望子线程一直运行,可以把子线程的代码写在while True里面一直循环, ...
- SPREAD for Windows Forms 下箭头追加行
''' <summary> ''' 下矢印の動作クラス ''' </summary> ''' <remarks></remarks> Public Cl ...
- 8 -- 深入使用Spring -- 1...4 属性占位符配置器
8.1.4 属性占位符配置器 PropertyPlaceholderConfigurer 是一个容器后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的 ...
- python cookie
http://www.jayconrod.com/posts/17/how-to-use-http-cookies-in-python
- 将百度编辑器ueditor用在easyui中
又一个自己想深爱却一直被拖着的对象--百度编辑器(ueditor) 但终究逃不过再次把它"供奉"起来的宿命,这不今天又得好好研究一下它的使用方法,以免自己今后再次使用时的各种不便- ...
- STL——序列式容器
一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...
- java十年技术栈[总结复习用]
以下摘自http://www.tvtv223.com/so/8/default/8.html#36-数据库的分库分表mycat java技术栈 参考了众多资料,这里就不再详细列举了,可以自行去搜索 1 ...
- 【Linux】 centos 7 启用端口
网上的大部分资料都是用iptables防火墙的,但是阿里云的centos 7默认防火墙是firewall.最为简单的方法其实就是关闭我们的防火墙: 1 查看下防火墙的状态: systemctl st ...
- Twitter的SnowFlake分布式id生成算法
二进制相关知识回顾 1.所有的数据都是以二进制的形式存储在硬盘上.对于一个字节的8位到底是什么类型 计算机是如何分辨的呢? 其实计算机并不负责判断数据类型,数据类型是程序告诉计算机该如何解释内存块. ...
- MFC控件CTabCtrl关联变量
1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control控件放到对话框中的合适位置上. 再在对话框类中,将该控件绑定一个变量 用两种方法: 1 ) 自己定义成员变量 CTabCtr ...