具有用户定义散列的对象

时间:2012-07-04 13:15:25

标签: python oop

假设我有一个带有重写哈希方法的类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)

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

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

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

我怎样才能做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

objects = {}
a = A(1234)
if a.hash in objects:
    a = objects[a.hash]
objects[a.hash] = a

答案 1 :(得分: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开始任意...

答案 2 :(得分:0)

我使用以下机制来确保没有创建任何重复的对象。这是Emmanuel和Jordan的答案的混合物。

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)