设计模式中的原型模式在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中映射类型的内建函数和工厂函数
Aug 19 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
python让列表倒序输出的实例
Jun 25 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
详解python中的闭包
Sep 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
Vue如何实现响应式系统
2018/07/11 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
opencv python如何实现图像二值化
2020/02/03 Python
Python阶乘求和的代码详解
2020/02/14 Python
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
应届生个人求职信模板
2013/11/26 职场文书
初中科学教学反思
2014/01/21 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
上下班时间调整通知
2015/04/23 职场文书
小学生表扬稿范文
2015/05/05 职场文书
走进科学观后感
2015/06/18 职场文书
小王子读书笔记
2015/06/29 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery