Patrón de diseño de Python: patrón de prototipo

Compartí varios artículos sobre patrones de diseño en el período anterior, y hoy sigo compartiendo patrones de diseño-patrones de prototipos.

  • Usaremos instancias de prototipos para especificar los tipos de objetos que se crearán y crearemos nuevos objetos copiando en profundidad estos prototipos.

  • La esencia del modo de prototipo es clonar un objeto, por lo que es muy práctico cuando la operación de inicialización del objeto es más complicada, lo que puede reducir en gran medida la pérdida de tiempo y mejorar el rendimiento.

  • En el modo de prototipo, no es necesario reinicializar el objeto, sino obtener dinámicamente el estado de tiempo de ejecución del objeto.

 

El significado de la copia profunda

Copia superficial: Se refiere al campo del objeto que se está copiando, y el objeto al que hace referencia el campo no se copiará. El objeto copiado y el objeto de origen tienen el mismo nombre, pero comparten la misma entidad.
La copia superficial copiará el contenido del objeto y sus referencias o referencias de subobjeto, pero no copiará el contenido referenciado y los subobjetos en sí.

 

Copia profunda: copia el objeto al que hace referencia el campo en la instancia del objeto. La copia profunda no solo copia referencias a objetos y contenido, sino que también copia el contenido referenciado. Por lo tanto, en general, la copia profunda es más completa que la copia superficial, pero también consume más recursos (incluidos los recursos de tiempo y espacio).

 

escenas que se utilizarán

Cuando tenemos un proyecto iterativo para actualizar, y la instancia del objeto en la segunda versión necesita ser modificada sobre la base de la primera versión, podemos usar el modo de prototipo para lograr esto en este momento, lo que ahorra mucho tiempo y mejora la Eficiencia.

 

ventaja

El modo de prototipo se utiliza para crear instancias complejas o que requieren mucho tiempo: copie una instancia existente para que el programa se ejecute de manera más eficiente. Y para el patrón de fábrica, el patrón de prototipo reduce la construcción de subclases.

 

Desventaja

Cada clase de producto debe configurarse con un método de clonación, y este método de clonación debe considerar la función de la clase como un todo.

 

Implementación de código Python

import copy
from collections import OrderedDict

#定义一个人的类
class Person():
    def __init__(self,name,age,high,sex,**info):
        self.name=name
        self.age=age
        self.high=high
        self.sex=sex
        #可以为实例添加其他额外属性,但必须是key:value格式的属性
        self.__dict__.update(info)

    #当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
    def __str__(self):
        myinfo=[]
        #OrderedDict 是 collections 提供的一种数据结构, 它提供了有序的dict结构。
        order_dict=OrderedDict(self.__dict__.items())
        for i in order_dict.keys():
            myinfo.append('{}:{}'.format(i,order_dict[i]))
            myinfo.append('\n')
        return ''.join(myinfo)

 

Definir una clase prototipo

class Prototype():
    def __init__(self):
        self.objects=dict() #定义原型对象字典表

    #在原型字典表中注册原型对象
    def register(self,id,obj):
        self.objects[id]=obj

    #在原型字典表中删除原型对象
    def destory(self,id):
        del self.objects[id]

    #根据 id 在原型字典表中查找原型对象并克隆
    def clone(self,id,**atter):
        obj1=self.objects.get(id)
        print(obj1)
        if not obj1:
            raise ValueError('Incorrect object id: {}'.format(id))
        obj2=copy.deepcopy(obj1)
        obj2.__dict__.update(atter)
        return obj2


if __name__ == '__main__':
    tony=Person('tony',34,170,'man',job='tester',birthday='2000-01-01',hobby='catch fish')
    print(tony)

    prototype=Prototype()
    prototype.register(1001,tony)
    tom=prototype.clone(1001,name='tom',age='19',birthday='2010-02-02')

    for i in (tony,tom):
        print(i)
    #输出两个Person对象是否是相同的id值
    print("id tony : {} != id tom : {}".format(id(tony), id(tom)))

 

El contenido de salida es el siguiente

name:tony
age:34
high:170
sex:man
job:tester
birthday:2000-01-01
hobby:catch fish

name:tony
age:34
high:170
sex:man
job:tester
birthday:2000-01-01
hobby:catch fish

name:tony
age:34
high:170
sex:man
job:tester
birthday:2000-01-01
hobby:catch fish

name:tom
age:19
high:170
sex:man
job:tester
birthday:2010-02-02
hobby:catch fish

id tony : 2930225522448 != id tom : 2930225522504

Bienvenido a prestar atención a la cuenta pública de [The Way of Infinite Testing], responder [Recibir recursos] Recursos de
aprendizaje de programación de Python productos secos, automatización de la interfaz de usuario de la aplicación del marco Python + Appium , automatización de la interfaz de usuario web del marco Python + Selenium , automatización de la API del marco Python + Unittest,


Los recursos y códigos se envían gratis ~
Hay un código QR de la cuenta oficial en la parte inferior del artículo, puede escanearlo en WeChat y seguirlo.

Observaciones: Mi cuenta pública personal se ha abierto oficialmente, dedicada al intercambio de tecnología de prueba, que incluye: pruebas de big data, pruebas funcionales, desarrollo de pruebas, automatización de la interfaz API, operación y mantenimiento de pruebas, pruebas de automatización de la interfaz de usuario, etc., búsqueda pública de WeChat cuenta: "Wuliang The Way of Testing", o escanee el código QR a continuación:

 ¡Presta atención y crezcamos juntos!

Supongo que te gusta

Origin blog.csdn.net/weixin_41754309/article/details/115303161
Recomendado
Clasificación