我应该使用__new__来防止实例化吗?

时间:2012-05-22 16:33:33

标签: python python-2.7

我正在构建自己的轻量级orm。我想将实例化对象保存在类变量(可能是字典)中。当我通过get(id)请求一个对象(通过类方法)时,我想从实例化列表中返回该对象,或者如果它不存在则创建一个。

有没有办法阻止对象的实例化(如果它的id已经存在于cls列表中)?

2 个答案:

答案 0 :(得分:1)

只是执行明确的检查,这是最干净的方法,我相信:

class OrmContainer(object):
    objects = {}

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

答案 1 :(得分:1)

有两种直接的方式 - 以及许多其他方式。正如您所建议的那样,其中一个是为对象编写__new__方法,它可以返回已存在的对象或创建新实例。

另一种方法是为你的对象使用工厂函数 - 并调用这个工厂函数而不是类 - 或多或少像这样:

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"]