0
\$\begingroup\$

My question is for validation of my code (any loop holes / bugs) and guidance the best methodology to implement for my requirement.

I am developing a Python application that will have many classes. We need to communicate in between each class - pass data. It would be very clumsy if across all classes I create a setter/getter method and refer them across different classes, hence I prefer to pass a container object in between all of them:

class One
  def __init__(self, container):

class Two
  def __init__(self, container):

Now obviously I want that this container object should be a Singleton object - only one instance to pass multiple data structures. Below is my code for same [class declaration for Container class]:

import abc

class Container(object):
    __metaclass__ = abc.ABCMeta
    __data1 = 0
    __data2 = 0
    @abc.abstractmethod
    def dummy():
        raise NotImplementedError()
    def __init__(self):
        self.__data1 = 0
        self.__data2 = 1
    def SetData(self,value):
        self.__data1 = value
    def GetData(self):
        return self.__data1

class Singleton(Container):
    _instances = {}
    def __new__(class_, *args, **kwargs):
        if class_ not in class_._instances:
                class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
        return class_._instances[class_]
    def dummy():
        pass

Now in my application, I would not be able to create an another separate instance of Container [abstract class] / Singleton class. So I can pass the object of Singleton like as mentioned below:

class One:
    def __init__(self, container)
        self.value = container.GetData()
        ................................
        container.SetData(9)
        Two(container)

class Two:
    def __init__(self, container)
        self.value = container.GetData()
        ................................
        container.SetData(19)
        ................................

class Three:
    def __init__(self, container)
        self.container = Singleton()
        ................................
        container.GetData() # will return value 19 only
        container.SetData(19)
        ................................



if __name__ == "__main__":
    container = Singleton()
    container.SetData(9)
    One(container)

Please comment on my approach and modifications required if any. This code will be pushed in production box - so I want to double check my implementation.

\$\endgroup\$
0

1 Answer 1

1
\$\begingroup\$

I don't see why you need a singleton. You are already passing around container references as parameters. So, if you only create one container in __main__ and pass that to the class instances, they will all be accessing the same container.

Instead of calling Singleton() in Three.__init__ you would simply do the usual thing:

class Three:
    def __init__(self, container)
        self.container = container
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.