设计模式中的原型模式在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线程中对join方法的运用的教程
Apr 09 Python
python读取oracle函数返回值
Jul 18 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python脚本实现验证码识别
Jun 07 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
深入学习python多线程与GIL
Aug 26 Python
Python如何执行系统命令
Sep 23 Python
python 日志模块logging的使用场景及示例
Jan 04 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Python requests用法和django后台处理详解
Mar 19 Python
python中validators库的使用方法详解
Sep 23 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
消息持续发送的完整例子
2006/10/09 PHP
请php正则走开
2008/03/15 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
laravel入门知识点整理
2020/09/15 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
javascript编写简易计算器
2017/05/06 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
您的网上新华书店:文轩网
2016/08/24 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
Unix控制后台进程都有哪些进程
2016/09/22 面试题
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
入党申请书格式
2019/06/20 职场文书
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript