设计模式中的原型模式在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素数检测的方法
May 11 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
Python SQLite3简介
Feb 22 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
Python  unittest单元测试框架的使用
Sep 08 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
python小程序实现刷票功能详解
Jul 17 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
python默认参数调用方法解析
Feb 09 Python
python 读取二进制 显示图片案例
Apr 24 Python
golang特有程序结构入门教程
Jun 02 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 while循环控制的简单实例
2016/05/30 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
vuejs指令详解
2017/02/07 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
作为网站管理者应当如何防范XSS
2014/08/16 面试题
网络程序员自荐信
2014/01/25 职场文书
学校班班通实施方案
2014/06/11 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
清明节寄语2015
2015/03/23 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python