设计模式中的原型模式在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 (1)
Oct 31 Python
编写Python脚本使得web页面上的代码高亮显示
Apr 24 Python
Python中的条件判断语句与循环语句用法小结
Mar 21 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
Django的信号机制详解
May 05 Python
Python框架Flask的基本数据库操作方法分析
Jul 13 Python
python实现查找所有程序的安装信息
Feb 18 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
python3读取autocad图形文件.py实例
Jun 05 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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/07/12 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
python正则表达式抓取成语网站
2013/11/20 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
python3.6数独问题的解决
2019/01/21 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
测绘工程专业个人自我评价
2013/12/01 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
融资合作协议书范本
2014/10/17 职场文书
入党现实表现材料
2014/12/23 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
邀请书模板
2015/02/02 职场文书
单位考核聘任报告
2015/03/02 职场文书
预备党员自我评价范文
2015/03/04 职场文书
入党转正申请书范文
2019/05/20 职场文书