首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可解对象池

可解对象池
EN

Stack Overflow用户
提问于 2014-09-02 14:48:05
回答 1查看 81关注 0票数 3

我已经建立了一个高度递归的、可理解的(假定是不可变的)数据结构。因此,最好每个对象只有一个实例(如果是objectA == objectB,那么没有理由不使用objectA is objectB)。

我试图通过定义一个自定义__new__()来解决这个问题。它创建请求的对象,然后检查它是否在字典中(存储为类变量)。如果有必要,将对象添加到dict中,然后返回。如果它已经在dict中,则会返回dict中的版本,新创建的实例将超出作用域。

这个解决方案有效,但是

  1. 在每个value上的key都是同一个对象时,我必须有一个小块。我真正需要的是,当我“显示”一个相同的对象时,从一个集合中提取一个对象。有什么更优雅的方法吗?
  2. 对于我在Python中的问题,有没有内置的/规范的解决方案?比如一个我可以继承的类.

我目前的实现是这样的:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-02 15:29:17

首先,我将使用工厂而不是覆盖__new__。见?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25626255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档