视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
设计模式中的原型模式在Python程序中的应用示例
2020-11-27 14:35:35 责编:小采
文档


原型模式:
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。

应用特性:
需要大量的基于某个基础原型进行微量修改而得到新原型时使用。

结构特性:
对象的复制机制,即浅复制和深复制。

例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(); 

下载本文
显示全文
专题