设计模式中的原型模式在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 查找文件夹下所有文件 实现代码
Jul 01 Python
python 中文字符串的处理实现代码
Oct 25 Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
set在python里的含义和用法
Jun 24 Python
Python 调用 Windows API COM 新法
Aug 22 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
Python3.8安装Pygame教程步骤详解
Aug 14 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 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中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
Python实现基本线性数据结构
2016/08/22 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
2014年创卫实施方案
2014/02/18 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
体操比赛口号
2014/06/10 职场文书
霸气队列口号
2014/06/18 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
教育见习报告范文
2014/11/03 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
初中班主任心得体会
2016/01/07 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python