Advertisement
viking_unet

Singleton template - 2 different cases

Apr 16th, 2020
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.08 KB | None | 0 0
  1. """
  2. Как должен вести себя Singleton при создании повторного экземпляра?
  3. - ругаться исключением
  4. - отдать единтсвенный экземпляр без запуска нового констркутора
  5. - отдать единтсвенный экземпляр с запуском нового констркутора
  6.  (! тогда нужно учесть как это отразится на уже созданных связанных объектах внутри, в общем нужно быть аккуратным !)
  7. """
  8.  
  9. # подход к созданию одиночки с вызовом конструктора этого же экземпляра при создании нового объекта-ссылки на одиночку
  10. class Singleton1(object):
  11.     _instance = None
  12.    
  13.     def __new__(cls, *args, **kwargs):
  14.         if not cls._instance:
  15.             cls._instance = object.__new__(cls)
  16.         return cls._instance
  17.    
  18.     def __init__(self, *args, **kwargs):
  19.         # запуск нового конструктора этого же экземпляра
  20.         # при повторной попытке создать экземпляр одиночки
  21.         # (фактически при получении нового объекта-ссылки на одиночку в нужном месте программы)
  22.         print('! Singleton1.__init__ !')
  23.         self.x = args[0]
  24.         self.y = kwargs['y']
  25.        
  26. s = Singleton1(1, y = 2)
  27. print("Object created", s, s.__dict__)
  28. ss = Singleton1(10, y = 20)
  29. print("Object created", ss, ss.__dict__)
  30.  
  31. # out:
  32. '''
  33. ! Singleton1.__init__ !
  34. Object created <__main__.Singleton1 object at 0x00C11FD0> {'x': 1, 'y': 2}
  35. ! Singleton1.__init__ !
  36. Object created <__main__.Singleton1 object at 0x00C11FD0> {'x': 10, 'y': 20}
  37. '''
  38.  
  39. # подход к созданию одиночки без вызова конструктора этого же экземпляра каждый раз при создании нового объекта-ссылки на одиночку
  40. class MetaSingleton(type):
  41.     _instance = None
  42.    
  43.     def __call__(cls, *args, **kwargs):
  44.         if not cls._instance:
  45.             cls._instance = type.__call__(cls, *args, **kwargs)
  46.         return cls._instance
  47.  
  48. class Singleton2(metaclass = MetaSingleton):
  49.     def __init__(self, *args, **kwargs):
  50.         # полное игнорирование новых аргументов конструктора
  51.         # т.к. сюда даже не попадаем при повторном создании экземпляра одиночки
  52.         print('! Singleton2.__init__ !')
  53.         self.x = args[0]
  54.         self.y = kwargs['y']
  55.  
  56. s = Singleton2(1, y = 2)
  57. print("Object created", s, s.__dict__)
  58. ss = Singleton2(10, y = 20)
  59. print("Object created", ss, ss.__dict__)
  60.  
  61. # out:
  62. '''
  63. ! Singleton2.__init__ !
  64. Object created <__main__.Singleton2 object at 0x00C3EAF0> {'x': 1, 'y': 2}
  65. Object created <__main__.Singleton2 object at 0x00C3EAF0> {'x': 1, 'y': 2}
  66. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement