1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
# 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
|