python高级编程:有用的设计模式2
# -*- coding: utf-8 -*-
__author__ = 'Administrator'
#python高级编程:有用的设计模式
#代理
"""
代理对一个代价昂贵或者远程的资源提供了一个非直接访问的机制
在客户和主意之间,如图.它用来优化对高代价主题的访问,比如,在前一章中描述的memoize装饰器可以被认为是一个代理
,它还可以用提供到一个主题智能访问,例如,大的视频文件可以封闭在代理中,以避免在用户仅仅请教其标题时就将文件载入到内存中
urllib2出给了一个例子,如下:
"""
from urllib2 import *
class Url(object):
def __init__(self,url):
self._url=urlopen(url)
def headrs(self):
return dict(self._url.headers.items())
def get(self):
return self._url.read()
python_org=Url('http://python.org')
print python_org.headrs()
"""
还可以用于获取页面主体以更新本地拷贝之前,通过查看报头last-modifed来确定页面是否已经改变
如下:
"""
python1=Url('http://ubuntu.mirrors.proxad.net/hardy/ubuntu-8.04-desktop-i386.iso')
print python1.headrs['last-modified']#可能会报错
"""
代理的另一个使用场景就是数据唯一性;
例如:一但上在多个位置显示相同文档的网站,文档附加了专用每个位置额外字段,如访问计数和几个许可设置,代理可以用于这样的情况,由它处理与位置相关的事件,并且指向原始文档而不是复制它,所以,一个指定的文档可以拥有很多代理,如果它的内容变化。
所有位置都将从中获益而不必处理版本同步;
使用代理作为可能存在于其他地方的某些东西的本地句柄,可以:
使进程更快
避免外部资源访问
降低内存负载
确保数据唯一性
"""
#外观:提供对子系统的,更简单的访问
"""
它只是一个使用应用程序的某个功能的快捷方式,不需要对应子系统的底层复杂性,比如:可以通过包级提供更高的函数来完成。
外观模型通过在现有系统基础上使用,在这里,包的觉用法是将综合到高级别的函数中,一般不需要提供这样的模式
__init__.py模块中简单函数就可以了
外观简化包的用法,一般在几次有使用反馈的迭代之后加入
"""
#行为型模式 有助于对进程进行结构化的模式
##观察者(observer)
"""
用来通知一系列对象状态的变化。使用观察都模式可以在一个应用程序中以可插入的方式来添加特性,并且解除现有代码库和新功能之间的耦合。
事件框架是观察者典型实现,如图,每当一个事件发生时,事件所有观察者都会得到触发此事件的对象通知。
事件是发生某些事件的时刻,在图形界面应用程序中,事件驱动编程(请看:http://en.wikipedia.org/wiki/eventdriven_programming)
常常被用来实现代码到用户操作的链接,比如,一个函数可以链接到mousemove事件上,这样每当鼠标移动到窗口上面上,这个函数将被调用,
在这样的情况下,将这些代码从窗口管理事件中耦合,大大简化了工作:函数将单独编写,注册为事件观察者,如图:
这种方法从微软公司的mfc framework(http://en.wikipedia.org/wiki/microsoft_foundation_class_library)
起就存在于所有的gui开发工具(如delphi)中。
但是这些代码也可能生成事件,比如,在一个将文档存储到数据库应用程序中,代码可能提供
documentcreated,docmentmodified和documentdeleted3个事件
一个针对文档的新特性可以将其自身注册为一个观察者,系文件被创建,修改或者删除时就能得到通知,并且进行相应的工作,这样可以在一个文档索引程序,当然,这要求负责创建,修改或者删除文档的代码触发事件
但是这比在应用程序代码库中到处添加索引的钩子程序要容易的多。
在python可以使用event来实现上面所说的,如下:
"""
class Event(object):
_obj=[]
def __init__(self,obj1):
self.obj1=obj1
@classmethod
def reg(cls,objs):
if objs not in cls._obj:
cls._obj.append(objs)
@classmethod
def reg1(cls,objs):
if objs in cls._obj:
cls._obj.remove(objs)
@classmethod
def not1(cls,sub):
event=cls(sub)
for o in cls._obj:
o(event)
#思路是观察者使用event类方法注册自己,并用携带触发 这些事件的event来获得,如下:
class WritEvent(object):
def __repr__(self):
return 'WritEvent(self)'
def log(event):
print '%s :was writees '%event._obj
WritEvent.reg(log)
class Anot(object):
def __call__(self, e):
print'yean %s told me!'%e
WritEvent.reg(Anot)
WritEvent.not1('a given file')
#对这个实现,可以做以下改进:
"""
允许开发人员修改顺序
使事件对象保存比主题更加的信息
如果希望使用现有工具,可以使用pydispatch,它提供了一个很好的多消费者和多生产者的调度机制
(http://www.sqlobject.org/module-sqlobject.pydispatch.html)
"""
python高级编程:有用的设计模式2的更多相关文章
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
- Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍
原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
随机推荐
- (1)QlikView概要
本文的内容,以学习的两个合伙人: I.什么是Qlikview II. QlikView 的优点和缺点 1.1什么是QlikView 1.1什么是QlikView QlikView是一个工具,一个商业智 ...
- Ftp实现文件同步
通常在做服务器与服务器文件.服务器与本地文件同步时通过Ftp服务实现,下面就以服务器文件和本地同步为例,介绍一下Ftp同步文件:首先建立一个Ftp站点服务,基本身份验证登陆,端口号为默认的21:Ftp ...
- linux 下文件的比较
1.cmp命令,比较两个文件是否相同 比较文件test1和test2,如果这两个文件完全相同,则无任何输出,否则,输出第一处不同所在的字节以及行号,然后忽略后面的不同之处,退出命令的执行. [root ...
- hdu 2033
水题 AC代码: #include <iostream> using namespace std; int main() { int i,j,n,k,a[100],b[100]; cin& ...
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...
- POj3421 X-factor Chains(质因数分解+排列组合)
POj3421X-factor Chains 一开始没读懂题意,不太明白 Xi | Xi+1 where a | b means a perfectly divides into b的意思,后来才发现 ...
- osg添加纹理示例
转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <o ...
- 乱七八糟 Nodejs 系列一:试水
看Nodejs比较舒服的人,个人认为主要是: 以前是后端,转成前端的人: 前端巨牛的人: 后端巨牛的人: 巨牛的人... 当然还有我这种,脑抽不止的人~~ 不过学习的过程中发现,如果不是上来就用exp ...
- php——会话控制
1.什么叫做会话控制 允许服务器根据客户端做出的连续请求. 2.为什么需要会话控制? 因为当你打开一个网站,并想访问该网站的其他页面的时候,如果没有会话控制,当跳转到其他页面的 时候,就需要再次输入账 ...
- SSH-key密钥生成
为了能够不用输入密码访问git库(github/gitlab),需要使用ssh key ssh-keygen -t rsa -C "<your email address>&qu ...