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作 ...
随机推荐
- VMware Playerでの仮想マシン起動エラー
Windows Updateすると.翌日VMware Playerの仮想マシン起動時に 「この仮想マシンを構成済み設定でパワーオンするのに十分な物理メモリがありません.」 のエラーとなることが時々あり ...
- openssl & openssh
什么是OpenSSL众多的密码算法.公钥基础设施标准以及SSL协议,或许这些有趣的功能会让你产生实现所有这些算法和标准的想法.果真如此,在对你表示敬佩的同时,还是忍不住提醒你:这是一个令人望而生畏的过 ...
- Spring getBean 首字母大小写问题
如果类第一个字母大写第二个小写,那么首字母小写获取bean 如果第一个和第二个字母都是大写的,那个获取bean首字母要大写
- Yarn执行流程
在Yarn中,JobTracker被分为两部分:ResourceManager(RM)和ApplicationMaster(AM). MRv1主要由三部分组成:编程模型(API).数据处理引擎(Map ...
- /var/spool/postfix/maildrop/ 中有大量的文件
今天查看硬盘剩余的容量,发现‘/’目录下占用了大量的空间:可我在这个目录下面没有放什么东西:仔细查看在/var/spool/postfix/maildrop/ 中发现了大量的文件.怎么会有这么多的文件 ...
- C语言实现字符串IP与整数型IP的相互转换
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h&g ...
- codeforces水题100道 第四题 Codeforces Round #105 (Div. 2) A. Insomnia cure (math)
题目链接:http://www.codeforces.com/problemset/problem/148/A题意:求1到d中有多少个数能被k,l,m,n中的至少一个数整出.C++代码: #inclu ...
- U盘安装centos6.4:缺少iso 9660映像
方法: 1.下载安装的ISO文件 到www.centos.org网站下载对应的Centos 6.4安装文件.下载站点我一般选择网易镜像站点 64位下载参考链接:http://mirrors ...
- 【Python3】端口占用监测的程序
#!/usr/bin/env python # -*- coding:utf- -*- #python端口占用监测的程序,该程序可以监测指定IP的端口是否被占用 import socket,time, ...
- jquery.sparkline.js简介
jQuery线状图插件Sparkline 官网地址:http://omnipotent.net/jquery.sparkline/ 文档地址:http://omnipotent.net/jquery. ...