设计模式中的原型模式在Python程序中的应用示例
Jun 10, 2016 pm 03:05 PM原型模式:
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。
应用特性:
需要大量的基于某个基础原型进行微量修改而得到新原型时使用。
结构特性:
对象的复制机制,即浅复制和深复制。
例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();

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Google AI annonce Gemini 1.5 Pro et Gemma 2 pour les développeurs

Comment utiliser Deepseek pour régler les comptes

La différence entre les modèles de conception et les modèles architecturaux dans le framework Java

La clé du codage : libérer la puissance de Python pour les débutants
