Я определяю синглтон Python следующим образом:
class Database:
initialized = False
def __init__(self):
self.id = random.randint(1,101)
print("Generated an id of ", self.id)
print("Loading database from file")
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Database, cls)\
.__new__(cls, *args, **kwargs)
return cls._instance
Это работает в том смысле, что каждый отдельный вызов Database()
фактически возвращает один-единственный экземпляр. Тем не менее, метод __init__()
это все еще , вызываемый при каждом вызове. Например,
database = Database()
if __name__ == '__main__':
d1 = Database()
d2 = Database()
print(d1.id, d2.id)
print(d1 == d2)
print(database == d1)
Производит вывод
Generated an id of 8
Loading database from file
Generated an id of 89
Loading database from file
Generated an id of 81
Loading database from file
81 81
True
True
Почему это? Что я могу сделать, чтобы инициализатор не вызывался более одного раза?