先模拟一个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框架)的更多相关文章

  1. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  2. Ubuntu16.04采用FastCGI方式部署Flask web框架

    1    部署nginx 1.1    安装nginx服务 root@desktop:~# apt-get install nginx -y 1.2    验证nginx服务是否启动 root@des ...

  3. 【Python之路】第十六篇--Web框架之Tornado

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  4. python运维开发(十七)----jQuery续(示例)web框架django

    内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...

  5. Python开发【第十八篇】Web框架之Django【基础篇】

    一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...

  6. python开发学习-day15(前端部分知识、web框架、Django创建项目)

    s12-20160430-day15 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  7. 【Python之路】第十五篇--Web框架

    Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...

  8. python_基于反射模拟Web框架路由系统

    根据用户输入的内容,导入模块 #根据用户输入的内容,导入模块 inp = input("请输入模块名: ") print(inp,type(inp)) dd = __import_ ...

  9. python的反射机制

    转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...

随机推荐

  1. iOS UITextField控件总结

    先声明下面总结不是自己写的. 参考网址:http://blog.csdn.net/tskyfree/article/details/8121915 //初始化textfield并设置位置及大小   U ...

  2. 8 -- 深入使用Spring -- 2...2 指定Bean的作用域

    8.2.2 指定Bean的作用域 当使用XML 配置方式来配置Bean实例时,可以通过scope来指定Bean实例的作用域,没有指定scope属性的Bean实例作用域默认是singleton. 当采用 ...

  3. NetBpm 测试篇(3)

    http://www.netbpm.org/movie/holiday/holiday.html

  4. osg剔除背面开启

    //设置背部剔除看不见背面东西 osg::ref_ptr<osg::CullFace> cullface=new osg::CullFace(osg::CullFace::BACK); s ...

  5. thinkjs 中增加过期时间

    使用thinkjs搭建的项目需要实现一小时后过期的功能:于是对比了新建项目与原有项目的不同之处:         官网中给的介绍:https://thinkjs.org/zh-cn/doc/2.2/a ...

  6. codeforces水题100道 第十二题 Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division (brute force)

    题目链接:http://www.codeforces.com/problemset/problem/122/A题意:判断一个数是否能被一个lucky number整除,一个lucky number是一 ...

  7. Java bean中布尔类型使用注意

    JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolea ...

  8. hadoop完全分布式搭建HA(高可用)

    2018年03月25日 16:25:26 D调的Stanley 阅读数:2725 标签: hadoop HAssh免密登录hdfs HA配置hadoop完全分布式搭建zookeeper 配置 更多 个 ...

  9. 【云迁移论文笔记】Cloud Migration Research:A Systematic Review

    Cloud Migration Research:A Systematic Review Author Info: Pooyan Jamshidi PhD Postdoctoral Researche ...

  10. java基础---->java多线程的使用(十)

    这里介绍一下java中关于线程状态的知识,主要通过代码演示各种状态出现的时机.少年时我们追求激情,成熟后却迷恋平庸,在我们寻找,伤害,背离之后,还能一如既往的相信爱情,这是一种勇气.每个人都有属于自己 ...