设计模式中的原型模式在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使用自定义user-agent抓取网页的方法
Apr 15 Python
从Python的源码浅要剖析Python的内存管理
Apr 16 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
Python3学习urllib的使用方法示例
Nov 29 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
python3.8动态人脸识别的实现示例
Sep 21 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
python实现图片批量压缩程序
2018/07/23 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
Python 支持向量机分类器的实现
2020/01/15 Python
python梯度下降算法的实现
2020/02/24 Python
Python中SQLite如何使用
2020/05/27 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
毕业生的自我评价范文
2013/12/31 职场文书
创新社会管理心得体会
2014/09/12 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
《1942》观后感
2015/06/08 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python