Source code for pysecret.singleton_alternative
# -*- coding: utf-8 -*-
import weakref
[docs]class CachedSpamManager(object):
"""
Instance cache manager.
"""
cached_klass = None
def __init__(self):
self._cache = weakref.WeakValueDictionary()
[docs] def new(self, name, *args, **kwargs):
"""
Factory method.
"""
if name not in self._cache:
temp = self.cached_klass._new(name, *args, **kwargs)
self._cache[name] = temp
else:
temp = self._cache[name]
return temp
def clear(self):
self._cache.clear()
class Spam(object):
def __init__(self, name, *args, **kwargs):
msg = "Can't instantiate directly, use Cached{}Manager.new(name, ...) instead." \
.format(self.__class__.__name__)
raise RuntimeError(msg)
# Alternate constructor
@classmethod
def _new(cls, name, *args, **kwargs):
"""
User custom instance constructor.
implement constructor this way::
def _new(cls, name, *args, **kwargs):
self = cls.__new__(cls)
# put __init__(...) logic here
self.name = name
return self
"""
raise NotImplementedError