gpt4 book ai didi

python - 可散列对象池

转载 作者:行者123 更新时间:2023-11-28 17:40:06 24 4
gpt4 key购买 nike

我制作了一个高度递归、可散列(假设不可变)的数据结构。因此,每个对象只有一个实例会很好(如果 objectA == objectB,那么没有理由不让 objectA is objectB)。

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

这个解决方案有效,但是

  1. 我必须有一个字典,其中每个 keyvalue 是同一个对象。我真正需要的是当我“显示”集合一个相等的对象时从集合中提取一个对象。有没有更优雅的方式来做到这一点?
  2. 是否有针对我的 Python 问题的内置/规范解决方案?比如我可以继承的类之类的....

我目前的实现是沿着这些路线进行的:

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

最佳答案

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

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

关于python - 可散列对象池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com