设计模式中的原型模式在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 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
Python实现学校管理系统
Jan 11 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
详解python中docx库的安装过程
Nov 08 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 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
Snoopy类使用小例子
2008/04/15 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
python处理二进制数据的方法
2015/06/03 Python
Python 装饰器深入理解
2017/03/16 Python
python numpy元素的区间查找方法
2018/11/14 Python
python3人脸识别的两种方法
2019/04/25 Python
Django对models里的objects的使用详解
2019/08/17 Python
python装饰器代替set get方法实例
2019/12/19 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
《乞巧》教学反思
2014/02/27 职场文书
给学校建议书范文
2014/05/13 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
特种设备安全管理制度
2015/08/06 职场文书