我已经建立了一个高度递归的、可理解的(假定是不可变的)数据结构。因此,最好每个对象只有一个实例(如果是objectA == objectB,那么没有理由不使用objectA is objectB)。
我试图通过定义一个自定义__new__()来解决这个问题。它创建请求的对象,然后检查它是否在字典中(存储为类变量)。如果有必要,将对象添加到dict中,然后返回。如果它已经在dict中,则会返回dict中的版本,新创建的实例将超出作用域。
这个解决方案有效,但是
value上的key都是同一个对象时,我必须有一个小块。我真正需要的是,当我“显示”一个相同的对象时,从一个集合中提取一个对象。有什么更优雅的方法吗?我目前的实现是这样的:
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也继承了dict。
发布于 2014-09-02 15:29:17
首先,我将使用工厂而不是覆盖__new__。见?。
其次,您可以使用创建对象所需的元组作为字典键(当然,如果相同的参数产生相同的对象),因此您不需要创建一个实际的(创建成本昂贵)对象实例。
https://stackoverflow.com/questions/25626255
复制相似问题