Patrón de diseño singleton en Python

Manav Narula 30 enero 2023
  1. Utilice los decoradores para implementar el patrón de diseño Singleton en Python
  2. Use una clase base para implementar el patrón de diseño Singleton en Python
  3. Utilice una metaclase para implementar el patrón de diseño Singleton en Python
  4. Use un módulo para implementar el patrón de diseño Singleton en Python
Patrón de diseño singleton en Python

Los patrones de diseño pueden representar algún código para resolver un problema. Singleton es uno de esos patrones de diseño y podemos crear diferentes objetos de una clase en Python.

Este patrón restringe solo un objeto de una clase determinada. Hay varios métodos para simular este patrón en Python.

Utilice los decoradores para implementar el patrón de diseño Singleton en Python

Los decoradores en Python son funciones que pueden tomar otras funciones y objetos como argumentos y modificar su comportamiento. Para usar decoradores, usamos el signo @.

Podemos usarlos para implementar el patrón de diseño Singleton.

Vea el siguiente ejemplo,

def singleton_dec(class_):
    instances = {}

    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]

    return getinstance


@singleton_dec
class Sample:
    def __init__(self):
        print("Object created.")


x = Sample()
y = Sample()
print(x, y)

Producción :

Object created.
<__main__.Sample object at 0x0000015E72D3CA48> <__main__.Sample object at 0x0000015E72D3CA48>

En el ejemplo anterior, creamos un decorador que toma toda la clase como argumento. Este decorador nos permite implementar objetos Singleton, lo que puede ser confirmado por la ubicación de x e y.

La desventaja de usar decoradores para Singleton es que la clase final Sample se convierte en una función, por lo que no podemos usar métodos de clase.

Use una clase base para implementar el patrón de diseño Singleton en Python

Una clase base es una clase especial de la que derivamos otras clases. No se crean instancias de esta clase base.

Podemos usar una clase base para proporcionar la estructura de Singleton en Python.

Por ejemplo,

class Singleton_base(object):
    _instance = None

    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance


class Sample1(Singleton_base):
    def __init__(self):
        print("Object created.")


x = Sample1()
y = Sample1()
print(x, y)

Producción :

Object created.
Object created.
<__main__.Sample object at 0x0000015E72D3F388> <__main__.Sample object at 0x0000015E72D3F388>

Este es un método eficaz; sin embargo, puede haber errores cuando se involucran varias clases debido a varias herencias.

Utilice una metaclase para implementar el patrón de diseño Singleton en Python

Una metaclase es una característica muy interesante en Python ya que puede definir el comportamiento de los objetos de una clase. Podemos decir que es una clase para una clase.

En Python 2, agregamos el atributo __metaclass__ en una clase. En Python 3, podemos agregarlo como argumento en la clase.

Podemos usar esta función para implementar el diseño Singleton en Python.

Por ejemplo,

class Singleton_meta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton_meta, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Sample(metaclass=Singleton_meta):
    def __init__(self):
        print("Object created.")


x = Sample()
y = Sample()
print(x, y)

Producción :

Object created.
<__main__.Sample object at 0x0000015E72D3FF88> <__main__.Sample object at 0x0000015E72D3FF88>

Esta es una aplicación adecuada de la metaclase y logra la herencia automática.

Use un módulo para implementar el patrón de diseño Singleton en Python

Probablemente, la implementación más sencilla y básica de Singletons en Python es mediante el uso de un módulo.

Sabemos que podemos crear módulos en Python. Un módulo que solo contiene funciones puede servir como Singleton, y esto se debe a que unirá todas estas funciones al módulo.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn