Ciao a tutti. Sto sviluppando una applicazione Python e mi sono trovato a dover implementare il pattern Singleton, seguendo quanto descritto in [1]. <br>Ho trovato diverse soluzioni su internet già scritte quindi il mio lavoro si è trasformato nel dover scegliere quella che sembrava adattarsi meglio alla vera natura del problema ed alla più corretta implementazione della soluzione.
<br>La mia scelta si è abbattuta sulla soluzione riportata nella mail, perfettamente funzionante e secondo me ben implementata (trovata in un commento di [2])<br> Ci sono però nel listato delle parti che non ho capito bene e che vorrei portare all&#39;attenzione della lista.
<br><br>1) La classe TestSingletonHelper è una classe &quot;interna&quot; alla classe TestSingleton, ed ha il metodo  __call__ <br>&nbsp;Questo serve per rendere di fatto privato l&#39;__init__ della classe TestSingleton, che così viene reso inaccessibile. Perchè si è reso necessario l&#39;uso di __call__? cosa realizza di preciso?
<br>2) def __call__( self, *args, **kw ) : perchè a __call__ viene passato  *args, **kw ? Cosa sono? a cosa servono e quando secondo voi vengono usati?<br><br>Grazie a tutti per l&#39;attenzione.<br><br>Cordiali saluti.<br>
<br>Marco Meoni.<br><br>-- Riferimenti --<br><br>[1] Gamma, Helm, et al, &quot;Design Patterns - Elements of Reusable Object-Oriented Software&quot;.<br>
    Addison-Wesley, 1995, ISBN 0-201-63361-2. <br><br>[2] <a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52558">http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52558</a><br><br><br>-- Codice --<br>
<br>class TestSingleton :<br><br>&nbsp;&nbsp;&nbsp; # Create a class variable that will hold a reference<br>&nbsp;&nbsp;&nbsp; # to the single instance of TestSingleton.<br><br>&nbsp;&nbsp;&nbsp; instance = None<br><br>&nbsp;&nbsp;&nbsp; # Define a helper class that will override the __call___
<br>&nbsp;&nbsp;&nbsp; # method in order to provide a factory method for TestSingleton.<br><br>&nbsp;&nbsp;&nbsp; class TestSingletonHelper :<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __call__( self, *args, **kw ) :<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If an instance of TestSingleton does not exist,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # create one and assign it to TestSingleton.instance.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if TestSingleton.instance is None :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object = TestSingleton()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestSingleton.instance = object<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Return TestSingleton.instance, which should contain<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # a reference to the only instance of TestSingleton<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # in the system.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TestSingleton.instance
<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; # Create a class level method that must be called to<br>&nbsp;&nbsp;&nbsp; # get the single instance of TestSingleton.<br><br>&nbsp;&nbsp;&nbsp; getInstance = TestSingletonHelper()<br><br>&nbsp;&nbsp;&nbsp; # Initialize an instance of the TestSingleton class.
<br><br>&nbsp;&nbsp;&nbsp; def __init__( self ) :<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Optionally, you could go a bit further to guarantee<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # that no one created more than one instance of TestSingleton:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not TestSingleton.instance
 == None :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise RuntimeError, &#39;Only one instance of TestSingleton is allowed!&#39;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #Continiue initialization...<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br># Test this implementation of the Singleton pattern.&nbsp; All of the
<br># references printed out should have the same address.<br>if __name__==&quot;__main__&quot;:<br>&nbsp;&nbsp;&nbsp; for i in range( 10 ) :<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s = TestSingleton.getInstance()<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; print s<br>&nbsp;&nbsp;&nbsp; <br># This call should raise a RuntimeError indicating
<br># that a single instance of TestSingleton already exists.<br><br>&nbsp;&nbsp;&nbsp; TestSingleton()<br clear="all"><br>-- <br>Sbaush