¿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>
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 claseDatabase
utilizando el constructorDatabase()
. Cada instancia tiene unid
diferente ya queself.id
se le asigna un número aleatorio en el método__init__
. Por lo tanto, la expresiónDatabase().id == Database().id
es equivalente a comparar dos números aleatorios diferentes, que probablemente serán distintos. Por lo tanto, el resultado esFalse
.En la segunda declaración,
d1 = Database()
yd2 = Database()
crean dos instancias diferentes de la claseDatabase
por separado. Comoid
es un atributo de instancia, cada instancia tiene su propioid
único. Por lo tanto, comparard1.id
cond2.id
significa comparar elid
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 esTrue
porque tantod1
comod2
están utilizando la misma instancia de la claseDatabase
, como se implementa en el patrón de diseño Singleton.