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'attenzione della lista.
<br><br>1) La classe TestSingletonHelper è una classe "interna" alla classe TestSingleton, ed ha il metodo __call__ <br> Questo serve per rendere di fatto privato l'__init__ della classe TestSingleton, che così viene reso inaccessibile. Perchè si è reso necessario l'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'attenzione.<br><br>Cordiali saluti.<br>
<br>Marco Meoni.<br><br>-- Riferimenti --<br><br>[1] Gamma, Helm, et al, "Design Patterns - Elements of Reusable Object-Oriented Software".<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> # Create a class variable that will hold a reference<br> # to the single instance of TestSingleton.<br><br> instance = None<br><br> # Define a helper class that will override the __call___
<br> # method in order to provide a factory method for TestSingleton.<br><br> class TestSingletonHelper :<br><br> def __call__( self, *args, **kw ) :<br><br> # If an instance of TestSingleton does not exist,
<br> # create one and assign it to TestSingleton.instance.<br><br> if TestSingleton.instance is None :<br> object = TestSingleton()<br> TestSingleton.instance = object<br>
<br> # Return TestSingleton.instance, which should contain<br> # a reference to the only instance of TestSingleton<br> # in the system.<br><br> return TestSingleton.instance
<br> <br> # Create a class level method that must be called to<br> # get the single instance of TestSingleton.<br><br> getInstance = TestSingletonHelper()<br><br> # Initialize an instance of the TestSingleton class.
<br><br> def __init__( self ) :<br><br> # Optionally, you could go a bit further to guarantee<br> # that no one created more than one instance of TestSingleton:<br><br> if not TestSingleton.instance
== None :<br> raise RuntimeError, 'Only one instance of TestSingleton is allowed!'<br><br> #Continiue initialization...<br> <br> <br># Test this implementation of the Singleton pattern. All of the
<br># references printed out should have the same address.<br>if __name__=="__main__":<br> for i in range( 10 ) :<br> s = TestSingleton.getInstance()<br> print s<br> <br># This call should raise a RuntimeError indicating
<br># that a single instance of TestSingleton already exists.<br><br> TestSingleton()<br clear="all"><br>-- <br>Sbaush