设计模式中的原型模式在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发送Email方法实例
Aug 21 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
用python编写第一个IDA插件的实例
May 29 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
利用Tensorflow的队列多线程读取数据方式
Feb 05 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
js局部刷新页面时间具体实现
2013/07/04 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
vuex存储token示例
2019/11/11 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
pandas.cut具体使用总结
2019/06/24 Python
Python实现代码统计工具
2019/09/19 Python
Python银行系统实战源码
2019/10/25 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
聘任书的写作格式及范文
2014/03/29 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
债务纠纷委托书
2014/08/30 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
应届毕业生自荐信
2015/03/04 职场文书
护理工作心得体会
2016/01/22 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python