假设我有一个带有重写哈希方法的类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
我怎样才能做到这一点?
谢谢!
答案 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)