我已经制作了一个高度递归,可缓存(假设不可变)的数据结构。因此,每个对象只有一个实例(如果objectA == objectB
,那么就没有理由不拥有objectA is objectB
)。
我尝试通过定义自定义__new__()
来解决它。它创建请求的对象,然后检查它是否在字典中(存储为类变量)。如有必要,该对象将添加到dict中,然后返回。如果它已经在dict中,则返回dict中的版本,并且新创建的实例超出范围。
此解决方案有效,但
value
的{{1}}是同一个对象。我真正需要的是当我"显示"时从一组中提取一个对象。设置一个相等的对象。有更优雅的方式吗?我目前的实施方式如下:
key
我不是专业的程序员,所以我怀疑这对应于一些众所周知的技术或概念。想到的最相似的概念是memoization和singleton。
上述实现的一个微妙问题是始终在class NoDuplicates(object):
pool = dict()
def __new__(cls, *args):
new_instance = object.__new__(cls)
new_instance.__init__(*args)
if new_instance in cls.pool:
return cls.pool[new_instance]
else:
cls.pool[new_instance] = new_instance
return new_instance
的返回值上调用__init__
。我做了一个元类来修改这个行为。但由于__new__
也继承自NoDuplicates
,因此最终导致了很多麻烦。
答案 0 :(得分:2)
首先,我会使用工厂而不是覆盖__new__
。请参阅Python's use of __new__ and __init__?。
其次,你可以使用创建对象所需的参数元组作为字典键(当然,如果相同的参数产生相同的对象),所以你不需要创建一个实际的(创建昂贵的)对象实例