我正在构建自己的轻量级表单。我想将实例化的对象保存在类变量(可能是字典)中。当我请求像 get(id) 这样的对象(通过类方法)时,我想从实例化列表中返回该对象,或者如果它不存在则创建一个。
有没有办法防止对象的实例化(如果它的 id 已经存在于 cls 列表中)?
我正在构建自己的轻量级表单。我想将实例化的对象保存在类变量(可能是字典)中。当我请求像 get(id) 这样的对象(通过类方法)时,我想从实例化列表中返回该对象,或者如果它不存在则创建一个。
有没有办法防止对象的实例化(如果它的 id 已经存在于 cls 列表中)?
只需执行显式检查,这是最干净的方法,我相信:
class OrmContainer(object):
objects = {}
@classmethod
def get(cls, id):
if id not in cls.objects:
cls.objects[id] = SomeOtherClass(id)
return cls.objects[id]
有两种直接的方法 - 以及许多其他方法。正如您所建议的,其中之一是__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"]