设计模式中的原型模式在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 相关文章推荐
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
Python2和Python3的共存和切换使用
Apr 12 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
Django模板Templates使用方法详解
Jul 19 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
python 基于opencv操作摄像头
Dec 24 Python
python实现自动清理文件夹旧文件
May 10 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
第十一节--重载
2006/11/16 PHP
php小偷相关截取函数备忘
2010/11/28 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
php判断是否为json格式的方法
2014/03/04 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
python从sqlite读取并显示数据的方法
2015/05/08 Python
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
销售员个人求职的自我评价
2014/02/10 职场文书
风险评估实施方案
2014/03/09 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
检讨书格式
2015/01/23 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
联村联户简报
2015/07/21 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL