2025-10-30 11:13:38 +01:00

30 lines
1.0 KiB
Python

# Copyright (c) 2017 Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import annotations
from threading import RLock
class Singleton(type):
"""Metaclass for classes that wish to implement Singleton
functionality. If an instance of the class exists, it's returned,
otherwise a single instance is instantiated and returned.
"""
# FIXME: object identity/singleton-ness does not appear to survive pickle roundtrip (eg, copy.copy, copy.deepcopy), implement __reduce_ex__ and __copy__?
def __init__(cls, name, bases, dct):
super(Singleton, cls).__init__(name, bases, dct)
cls.__instance = None
cls.__rlock = RLock()
def __call__(cls, *args, **kw):
if cls.__instance is not None:
return cls.__instance
with cls.__rlock:
if cls.__instance is None:
cls.__instance = super(Singleton, cls).__call__(*args, **kw)
return cls.__instance