Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import weakref
- class UserException(Exception): pass
- class MetaSingleton(type):
- _instance = []
- def __call__(cls, *args, **kwargs):
- if not cls._instance:
- cls._instance.append(type.__call__(cls, *args, **kwargs))
- else:
- if args or kwargs: raise UserException("can't recreate singleton with new args until old will be cleared")
- return weakref.proxy(cls._instance[0])
- class Singleton(metaclass = MetaSingleton):
- def __init__(self, *args, **kwargs):
- # полное игнорирование новых аргументов конструктора
- # т.к. сюда даже не попадаем при повторном создании экземпляра одиночки
- print('singleton.__init__')
- self.x = args[0]
- self.y = kwargs['y']
- def clear(self):
- # здесь должны быть все действия по корректному разрешению
- # всех коллизий с уже созданными внутри объектами от прошлого одиночки
- print('singleton cleared')
- MetaSingleton._instance.pop()
- def __del__(self):
- # метод удаления вызывается сборщиком мусора только когда все ссылки на экземпляр теряются
- print('__del__')
- def test(self, x = None):
- # тестовый метод класса одичноки - любая бизнес-логика в качестве методов
- self._x = x
- return self._x
- # создали три экземпляра одиночки:
- # - первый с аргументами (создание и настройка единственного экземпляра)
- # - второй без аргументов (чисто копия ссылки на экземпляр)
- # - третий с новыми аргументами (возбуждаем исключение, т к одиночку нужно пердварительно очистить !)
- s = Singleton(1, y = 2)
- print("Object created (fist time)", s, s.__dict__)
- ss = Singleton()
- print("Object created (copy without args)", ss, ss.__dict__)
- try:
- sss = Singleton(10, y = 20)
- except Exception as err:
- print("Object not created (exception - try to call with args after fist time and without clear):", err)
- """
- >> singleton.__init__
- >> Object created (fist time) <__main__.Singleton object at 0x00323D90> {'x': 1, 'y': 2}
- >> Object created (copy without args) <__main__.Singleton object at 0x00323D90> {'x': 1, 'y': 2}
- >> Object not created (exception - try to call with args after fist time and without clear):
- >> can't recreate singleton with new args until old will be cleared
- """
- # очищаем любой из созданных копий одиночки
- s.clear()
- """
- >> singleton cleared
- >> __del__
- """
- # пробуем вывести данные по каждой копии одиночки после очистки,
- # должно быть исключение - ссылки на оригинальный экземпляр больше нет
- try: print(s)
- except Exception as err:
- print('try ro print first singleton copy variable:', err)
- try: print(ss)
- except Exception as err:
- print('try ro print second singleton copy variable:', err)
- """
- >> try ro print first singleton copy variable: weakly-referenced object no longer exists
- >> try ro print second singleton copy variable: weakly-referenced object no longer exists
- """
- # заново создаём новый
- s = Singleton(10, y = 20)
- print("Object recreated", s, s.__dict__)
- res = s.test(123)
- print('test = %s' % res)
- """
- >> singleton.__init__
- >> Object recreated <__main__.Singleton object at 0x00323D90> {'x': 10, 'y': 20}
- >> test = 123
- """
- print('done')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement