0

假设我有一个 A 类,它有一个重写的哈希方法,它返回一些用户定义的整数:

class A:
   def __init__(self,hash):
      self.hash = hash

   def __hash__(self):
      return self.hash

   def __cmp__(self,other):
      return cmp(self.hash,other.hash)

现在,在任何给定的时间点,我都希望只有一个具有相同哈希的对象,所以我维护一个s包含 A 类对象的集合。我的问题如下:

s = {A(1234)} 
a = A(1234)

if a in s:
   # then assign the corresponding object in set s to a

我怎样才能做到这一点?

谢谢!

4

3 回答 3

1

不要使用集合,使用字典(从某种意义上说,它也是一个集合)。

objects = {}
a = A(1234)
if a.hash in objects:
    a = objects[a.hash]
objects[a.hash] = a
于 2012-07-04T13:20:05.413 回答
1

我会使用作为类变量实现的单例:

>>> class A:
    HASH = 0
    def __init__(self):
        self.hash = A.HASH
        A.HASH += 1
    def __hash__(self):
        return self.hash
    def __cmp__(self,other):
        return cmp(self.hash, other.hash)


>>> a = A()
>>> a.__hash__()
0
>>> a2 = A()
>>> a2.__hash__()
1
>>> 

由于每次实例化一个新对象时它都会增加,因此您肯定不会有两倍的相同值(尽管这可能不是线程安全的)。

编辑:如果计算哈希值,则此解决方案无效,因为它任意从 0 开始...

于 2012-07-04T13:20:20.497 回答
0

I used the following mechanism to make sure that no duplicate object was ever created. This is a mixture of Emmanuel's and Jordan's answers.

class A(object):
   __singletons__ = dict()

   def __new__(cls,hash):
      if hash not in cls.__singletons__.keys():
         cls.__singletons__[hash] = super(A,cls).__new__(cls)

      return cls.__singletons__[hash]

   def __init__(self,hash):
      self.hash = hash

   def __hash__(self):
      return self.hash

   def __cmp__(self,other):
      return cmp(self.hash,other.hash)
于 2012-07-04T14:17:15.773 回答