2012-07-04 75 views
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 

我怎樣才能做到這一點?

謝謝!

+0

這不是['__cmp__'](http://docs.python.org/reference/datamodel.html#object.__cmp__)的有效定義。 –

+0

你說得對,的確如此。我修正了這一點。 – Greg

+0

'a2'的用途是什麼? – martineau

回答

1

不要使用一個集合,使用一個字典(這也是一個集合,在某種意義上)。

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

或者,也可以使用'objects.get(a.hash(),a)'或'setdefault'來設置它。 –

+0

你不需要使用'a.hash',只需'a'就可以了。 – martineau

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開始任意這種解決方案是無效的......

0

我用下面的機制,以確保沒有重複的對象是曾經創造。這是伊曼紐爾和約旦答案的混合物。

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)