¿Debo usar __new__ para evitar la creación de instancias?

Estoy construyendo mi propio ormo ligero. Me gustaría mantener los objetos instanciados en una variable de clase (tal vez un diccionario). Cuando solicito un objeto (a través de un método de clase) como get(id), me gustaría devolver el objeto de la lista instanciada o crear uno si no existe.

¿Hay alguna manera de evitar la creación de instancias de un objeto (si su identificación ya existe en la lista cls)?

preguntado el 22 de mayo de 12 a las 17:05

2 Respuestas

Hay dos formas sencillas de hacerlo, y también muchas otras formas. Una de ellas, como usted sugiere, es escribir el __new__ método para sus objetos, que podría devolver un objeto ya existente o crear una nueva instancia.

Otra forma es usar una función de fábrica para sus objetos, y llamar a esta función de fábrica en lugar de la clase, más o menos así:

class _MyClass(object):
    pass

def MyClass(*args, **kw):
    if not "my_class_object" in all_objects:
         all_objects["my_class_object"] = _MyClass(*args, **kw)
    return all_objects["my_class_object"]

contestado el 22 de mayo de 12 a las 17:05

Simplemente realice una verificación explícita, es el método más limpio, creo:

class OrmContainer(object):
    objects = {}

    @classmethod
    def get(cls, id):
        if id not in cls.objects:
            cls.objects[id] = SomeOtherClass(id)
        return cls.objects[id]

contestado el 22 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.