[Python] Pattern singleton e chiamata __call__
Sbaush
sbaush a gmail.com
Mer 28 Mar 2007 23:56:41 CEST
Ciao a tutti. Sto sviluppando una applicazione Python e mi sono trovato a
dover implementare il pattern Singleton, seguendo quanto descritto in [1].
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.
La mia scelta si è abbattuta sulla soluzione riportata nella mail,
perfettamente funzionante e secondo me ben implementata (trovata in un
commento di [2])
Ci sono però nel listato delle parti che non ho capito bene e che vorrei
portare all'attenzione della lista.
1) La classe TestSingletonHelper è una classe "interna" alla classe
TestSingleton, ed ha il metodo __call__
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?
2) def __call__( self, *args, **kw ) : perchè a __call__ viene passato
*args, **kw ? Cosa sono? a cosa servono e quando secondo voi vengono usati?
Grazie a tutti per l'attenzione.
Cordiali saluti.
Marco Meoni.
-- Riferimenti --
[1] Gamma, Helm, et al, "Design Patterns - Elements of Reusable
Object-Oriented Software".
Addison-Wesley, 1995, ISBN 0-201-63361-2.
[2] http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52558
-- Codice --
class TestSingleton :
# Create a class variable that will hold a reference
# to the single instance of TestSingleton.
instance = None
# Define a helper class that will override the __call___
# method in order to provide a factory method for TestSingleton.
class TestSingletonHelper :
def __call__( self, *args, **kw ) :
# If an instance of TestSingleton does not exist,
# create one and assign it to TestSingleton.instance.
if TestSingleton.instance is None :
object = TestSingleton()
TestSingleton.instance = object
# Return TestSingleton.instance, which should contain
# a reference to the only instance of TestSingleton
# in the system.
return TestSingleton.instance
# Create a class level method that must be called to
# get the single instance of TestSingleton.
getInstance = TestSingletonHelper()
# Initialize an instance of the TestSingleton class.
def __init__( self ) :
# Optionally, you could go a bit further to guarantee
# that no one created more than one instance of TestSingleton:
if not TestSingleton.instance == None :
raise RuntimeError, 'Only one instance of TestSingleton is
allowed!'
#Continiue initialization...
# Test this implementation of the Singleton pattern. All of the
# references printed out should have the same address.
if __name__=="__main__":
for i in range( 10 ) :
s = TestSingleton.getInstance()
print s
# This call should raise a RuntimeError indicating
# that a single instance of TestSingleton already exists.
TestSingleton()
--
Sbaush
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20070328/16e78f4f/attachment.htm
Maggiori informazioni sulla lista
Python