设计模式中的原型模式在Python程序中的应用示例


Posted in Python onMarch 02, 2016

原型模式:
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。

应用特性:
需要大量的基于某个基础原型进行微量修改而得到新原型时使用。

结构特性:
对象的复制机制,即浅复制和深复制。

例1:

#!/usr/bin/env python  
#encoding: utf-8  
from copy import copy, deepcopy 
 
class test_obj: 
  def __init__(self, id): 
    self.id = id 
   
class proto_type: 
  def __init__(self, name, id): 
    self.name = name 
    self.obj = test_obj(id) 
   
  def display(self): 
    print self.name 
    print self.obj.id 
 
  def clone(self): 
    return copy(self) 
   
  def deep_clone(self): 
    return deepcopy(self) 
 
      
if '__main__' == __name__:  
  obj1 = proto_type('name1', 1) 
  obj2 = obj1.clone() 
  obj3 = obj1.deep_clone() 
  obj2.name = 'name2' 
  obj2.obj.id = 2 
  obj3.name = 'name3' 
  obj3.obj.id = 3  
  obj1.display() 
  obj2.display() 
  obj3.display() 
  print obj1.__class__ 
  print obj2.__class__ 
  print obj3.__class__

结果:

name1 
2    #因为obj2是浅复制,所以对象没有被复制,导致新对象的修改影响了原来的就对象的值 
name2 
2 
name3 
3    #因为是深复制,所以不会影响之前的旧对象 
__main__.proto_type 
__main__.proto_type 
__main__.proto_type

这里我们再来回顾一下Python编程基础中关于浅拷贝和深拷贝的知识点:
浅拷贝(Shallow Copy):
指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体。
深拷贝(deep copy):
对对象实例中字段引用的对象也进行拷贝。

好了,基于以上,我们再来看一个例子:

例2:

#encoding=utf-8 
# 
#by panda 
#原型模式 
 
import copy 
 
def printInfo(info): 
  print unicode(info, 'utf-8').encode('gbk') 
 
#拷贝接口 
class ICloneable: 
  def shallowClone(self): 
    return copy.copy(self) 
   
  def deepClone(self): 
    return copy.deepcopy(self) 
 
#工作经历 
class WorkExperience(ICloneable): 
  workData = "" 
  company = "" 
  pass 
 
#简历 
class Resume(ICloneable): 
  name = "" 
  sex = '未知' 
  age = 0 
  work = None 
   
  def __init__(self, name, work = WorkExperience()): 
    self.name = name 
    self.work = work; 
   
  def setPersonInfo(self, sex, age): 
    self.sex = sex 
    self.age = age 
   
  def setWorkExperience(self, workData, company): 
    self.work.workData = workData 
    self.work.company = company   
   
  def display(self): 
    printInfo('%s, %s, %d' % (self.name,self.sex,self.age)) 
    printInfo('%s, %s' % (self.work.workData, self.work.company)) 
 
def clientUI(): 
  a = Resume('大鸟') 
  a.setPersonInfo('男',29) 
  a.setWorkExperience("1998-2000","XX公司")   
   
  #浅拷贝 
  b = a.shallowClone() 
  b.setWorkExperience("2000-2006","YY公司")     
   
  #深拷贝 
  c = a.deepClone() 
  c.setWorkExperience("2006-2009","ZZ公司")   
   
  b.display() 
  a.display()  
  c.display()   
  return 
 
if __name__ == '__main__': 
  clientUI();
Python 相关文章推荐
python取代netcat过程分析
Feb 10 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python 通配符删除文件的实例
Apr 24 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
python opencv判断图像是否为空的实例
Jan 26 Python
Python3.5运算符操作实例详解
Apr 25 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
一行Python命令实现批量加水印
Apr 07 Python
深入解析Python设计模式编程中建造者模式的使用
Mar 02 #Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 #Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 #Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 #Python
探究python中open函数的使用
Mar 01 #Python
Saltstack快速入门简单汇总
Mar 01 #Python
通过Python使用saltstack生成服务器资产清单
Mar 01 #Python
You might like
投票管理程序
2006/10/09 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
Python正则表达式介绍
2012/08/06 Python
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
python按照多个条件排序的方法
2019/02/08 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
个人简历自我评价范文
2014/02/04 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
看雷锋电影观后感
2015/06/10 职场文书