设计模式中的原型模式在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使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
详解python eval函数的妙用
Nov 16 Python
python中的随机函数小结
Jan 27 Python
python一键去抖音视频水印工具
Sep 14 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 26 Python
python中urllib包的网络请求教程
Apr 19 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
Python字符串替换实例分析
2015/05/11 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
python实现的Iou与Giou代码
2020/01/18 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
python离线安装外部依赖包的实现
2020/02/13 Python
python爬虫实现获取下一页代码
2020/03/13 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
总裁助理岗位职责
2014/02/17 职场文书
超市食品安全承诺书
2015/04/29 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
2019各种保证书范文
2019/06/24 职场文书
如何写好开幕词?
2019/06/24 职场文书