es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué la instancia de esta clase singleton está dando valores diferentes?

¿Por qué estas dos declaraciones dan resultados diferentes…
print(Database().id == Database().id) (que da False)
– pero da True de esta manera

d1 = Database()
d2 = Database()
print(d1.id == d2.id)

Aquí tienes todo el código:

import random

class Database:
    initialized = False

<pre><code>def __init__(self):
    self.id = random.randint(1, 101)

_instance = None

def __new__(cls, *args, **kwargs):
    if not cls._instance:
        cls._instance = super(Database, cls).__new__(cls, *args, **kwargs)
    return cls._instance
</code></pre>

print(Database().id == Database().id)

<h1>False</h1>

d1 = Database()
d2 = Database()
print(d1.id == d2.id)

<h1>True</h1>

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que estas dos declaraciones dan resultados diferentes se debe a la implementación del patrón de diseño Singleton en la clase Database.

    En la primera declaración print(Database().id == Database().id), se crean dos instancias de la clase Database utilizando el constructor Database(). Cada instancia tiene un id diferente ya que self.id se le asigna un número aleatorio en el método __init__. Por lo tanto, la expresión Database().id == Database().id es equivalente a comparar dos números aleatorios diferentes, que probablemente serán distintos. Por lo tanto, el resultado es False.

    En la segunda declaración, d1 = Database() y d2 = Database() crean dos instancias diferentes de la clase Database por separado. Como id es un atributo de instancia, cada instancia tiene su propio id único. Por lo tanto, comparar d1.id con d2.id significa comparar el id de dos instancias diferentes, que pueden o no ser iguales dependiendo del resultado del generador de números aleatorios. Sin embargo, en este caso, el resultado es True porque tanto d1 como d2 están utilizando la misma instancia de la clase Database, como se implementa en el patrón de diseño Singleton.

Comments are closed.