设计模式中的原型模式在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实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
python+pyqt实现12306图片验证效果
Oct 25 Python
Python中super函数的用法
Nov 17 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 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
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
调整PHP的性能
2013/10/30 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
化工专业推荐信范文
2013/11/28 职场文书
中学门卫岗位职责
2013/12/26 职场文书
考试违纪检讨书
2014/02/02 职场文书
小学清明节活动方案
2014/03/08 职场文书
法制报告会主持词
2014/04/02 职场文书
委托书格式
2014/08/01 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
2014年计生工作总结
2014/11/21 职场文书
实习推荐信格式模板
2015/03/27 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书