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作 ...
随机推荐
- GridFS实现原理
GridFS在数据库中,默认使用fs.chunks和fs.files来存储文件. 其中fs.files集合存放文件的信息,fs.chunks存放文件数据. 一个fs.files集合中的一条记录内容如下 ...
- python打造线程池
# coding=utf-8 import threading import Queue import time import traceback class ThreadPoolExecutor(o ...
- lua 按拉分析与合成
-- 将数值分解成bytes_table local function decompose_byte(data) if not data then return data end local tb = ...
- 把mongodb服务添加到系统服务中,报错:[sc] openscmanager 失败 5
添加mongodb系统服务命令如下: sc create MongoDB binPath= "D:\MongoDB\bin\mongod.exe --service --dbpath D:\ ...
- Apache 配置文件详解
0x01 禁止目录列表访问 () 备份httpd.conf配置文件,修改内容: <Directory "/web"> Options FollowSymLinks Al ...
- 查看本地RF版本号
在CMD下执行:pybot --version
- N76E003之IAP
修改FLASH数据通常需要很长时间,不像RAM那样可以实时操作.而且擦除.编程或读取FLASH数据需要遵循相当复杂的时序步骤.N76E003提供方便FALSH编程方式,可以帮助用户通过IAP方式,重新 ...
- Struts2(二)工作原理
一.概述 1.struts框架本身分为三个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 2.struts2工作的基本流程: 客户端初始化一个指 ...
- PHP 连接oracle
function connect_oracle(){ static $dbconn = false; if(!$dbconn){ $db_server = "127.0.0.1"; ...
- chrome插件开发,易懂