DEV Community

Michel Moreira
Michel Moreira

Posted on • Updated on

Padrão Prototype em Python

O padrão Prototype é um padrão criacional, este tem como principal objetivo permitir que objetos sejam copiados sem que seus códigos fiquem dependentes de suas classes.

Este padrão de projeto determina que o próprio objeto é responsável pelo clonagem, facilitando assim o processo, uma vez que as classes podem possuir conteúdo que não pode ser copiado "de fora".

Exemplo do código em Python

class SelfReferencingEntity:
    def __init__(self):
        self.parent = None

    def set_parent(self, parent):
        self.parent = parent


class SomeComponent:

    def __init__(self, some_int, some_list_of_objects, some_circular_ref):
        self.some_int = some_int
        self.some_list_of_objects = some_list_of_objects
        self.some_circular_ref = some_circular_ref

    def __copy__(self):
        # First, let's create copies of the nested objects.
        some_list_of_objects = copy.copy(self.some_list_of_objects)
        some_circular_ref = copy.copy(self.some_circular_ref)

        # Then, let's clone the object itself, using the prepared clones of the
        # nested objects.
        new = self.__class__(
            self.some_int, some_list_of_objects, some_circular_ref
        )
        new.__dict__.update(self.__dict__)

        return new

    def __deepcopy__(self, memo={}):
        # First, let's create copies of the nested objects.
        some_list_of_objects = copy.deepcopy(self.some_list_of_objects, memo)
        some_circular_ref = copy.deepcopy(self.some_circular_ref, memo)

        # Then, let's clone the object itself, using the prepared clones of the
        # nested objects.
        new = self.__class__(
            self.some_int, some_list_of_objects, some_circular_ref
        )
        new.__dict__ = copy.deepcopy(self.__dict__, memo)

        return new
Enter fullscreen mode Exit fullscreen mode

Python oferece uma interface própria de Prototype através das funções "copy.copy" e "copy.deepcopy". A classe que desejar personalizar estas cópias deve sobrescrever as funções "copy" e "deepcopy".

A função "copy.copy" é considera uma "cópia rasa" e cria um novo objeto preenchendo-o com referências para seus respectivos itens no objeto original. Já a "copy.deepcopy" cria a cópia e a preenche utilizando recursividade.


Referências
Padrões de Projeto (Diogo Moreira, 2020)
Mergulho nos Padrões de Projeto - v2020-1.14 (Alexander Shvets, 2020)
copy in Python
Os códigos usados como exemplo foram retirados do livro Mergulho nos Padrões de Projeto.

Top comments (0)