我正在构建自己的轻量级orm。我想将实例化对象保存在类变量(可能是字典)中。当我通过get(id)请求一个对象(通过类方法)时,我想从实例化列表中返回该对象,或者如果它不存在则创建一个。
有没有办法阻止对象的实例化(如果它的id已经存在于cls列表中)?
答案 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"]