0

what would be a good way to ensure that only a unique instance is created when class object is initialized, please be specific in your answers.

for example for the following class I want to make sure when I create an StateMachineSystems instance with 'TEST' any latter created objects (y in this case) points to x created previously.

class StateMachineSystems:

    def __init__(self,system_name):
        self.system_name = system_name

    def set_sequence_number(self,sequnce_number):
        self.sequnce_number = sequnce_number

    def get_sequence_number(self):
        return self.sequnce_number

    def get_system_name(self):
        return self.system_name


x = StateMachineSystems('TEST')
y = StateMachineSystems('TEST')

if x==y:
   print("single instance")

.... 
single instance
Vaibhav Chauhan
  • 787
  • 3
  • 11
  • 29
  • 1
    I guess you are looking for Singleton Design Pattern. You can check different ways of creating it [here](https://stackoverflow.com/questions/6760685/creating-a-singleton-in-python). – vb_rises Jun 19 '19 at 18:54
  • I think this is exactly what I needed. (Method based singleton) – Vaibhav Chauhan Jun 19 '19 at 19:12

1 Answers1

1

I think after looking at singleton design pattern this is what works for me.

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class StateMachineSystems(metaclass=Singleton):

    def __init__(self,system_name):
        self.system_name = system_name

    def set_sequence_number(self,sequnce_number):
        self.sequnce_number = sequnce_number

    def get_sequence_number(self):
        return self.sequnce_number

    def get_system_name(self):
        return self.system_name

x = StateMachineSystems('TEST')
x.set_sequence_number('1234')
print(x.get_sequence_number())

y = StateMachineSystems('TEST')
print(y.get_sequence_number())

y.set_sequence_number('4321')
print(y.get_sequence_number())
print(x.get_sequence_number())
............
1234
1234
4321
4321
Vaibhav Chauhan
  • 787
  • 3
  • 11
  • 29