设计模式中的原型模式在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中的type()方法的使用
May 21 Python
django实现分页的方法
May 26 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
Python绘制3D图形
May 03 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
python如何安装下载后的模块
Jul 03 Python
Django中session进行权限管理的使用
Jul 09 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
PHP5中MVC结构学习
2006/10/09 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
php实现算术验证码功能
2018/12/05 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
Pandas分组与排序的实现
2019/07/23 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
python exit出错原因整理
2020/08/31 Python
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
优秀小学生家长评语
2014/01/30 职场文书
物资采购方案
2014/06/12 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
运动会表扬稿范文
2015/05/05 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android
go开发alertmanger实现钉钉报警
2021/07/16 Golang