可清洗物品池

时间:2014-09-02 14:48:05

标签: python

我已经制作了一个高度递归,可缓存(假设不可变)的数据结构。因此,每个对象只有一个实例(如果objectA == objectB,那么就没有理由不拥有objectA is objectB)。

我尝试通过定义自定义__new__()来解决它。它创建请求的对象,然后检查它是否在字典中(存储为类变量)。如有必要,该对象将添加到dict中,然后返回。如果它已经在dict中,则返回dict中的版本,并且新创建的实例超出范围。

此解决方案有效,但

  1. 我必须有一个字典,其中每个value的{​​{1}}是同一个对象。我真正需要的是当我"显示"时从一组中提取一个对象。设置一个相等的对象。有更优雅的方式吗?
  2. 我的Python问题是否有内置/规范的解决方案?比如我可以继承的类或者什么......
  3. 我目前的实施方式如下:

    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,因此最终导致了很多麻烦。

1 个答案:

答案 0 :(得分:2)

首先,我会使用工厂而不是覆盖__new__。请参阅Python's use of __new__ and __init__?

其次,你可以使用创建对象所需的参数元组作为字典键(当然,如果相同的参数产生相同的对象),所以你不需要创建一个实际的(创建昂贵的)对象实例