设计模式中的原型模式在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 requests 报错方法集锦
Mar 19 Python
Python操作MongoDB详解及实例
May 18 Python
Python lambda函数基本用法实例分析
Mar 16 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
python 中如何获取列表的索引
Jul 02 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
详解Python文件修改的两种方式
Aug 22 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 Python
Python调用shell cmd方法代码示例解析
Jun 18 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
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
vue之延时刷新实例
2019/11/14 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Python中的startswith和endswith函数使用实例
2014/08/25 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
Python对象转JSON字符串的方法
2016/04/27 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
python操作excel的方法
2018/08/16 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
竞选文艺委员演讲稿
2014/04/28 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js