Resumiendo... la mejor solución actual es usando metaclases y es:
class Singleton(type):
def __init__(cls, name, bases, dct):
cls.__instance = None
super(Singleton,cls).__init__(cls, name, bases, dct)
def __call__(cls, *args, **kw):
if cls.__instance is None:
cls.__instance = super(Singleton,cls).__call__(cls, *args,**kw)
return cls.__instance
No se si tiene algun problema, ya que no estoy nada puesto en metaclases. Para acabar unas referencias comentadas:
- wiki-es: donde ví la implementación de metaclases. Pero el cçodigo aquçi incluido varia en que usa super.
- wiki-en: no tiene la opción de metaclass
- Gary Robinson, implementa un singleton siguiendo unas ideas de aquí. No he tenido tiempo de mirarlo. Pero lo dejo anotado, ya que puede merecer la pena echarle un ojo.