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)

さて、任意の時点で、同じハッシュを持つオブジェクトを 1 つだけ持ちたいので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
>>> 

新しいオブジェクトをインスタンス化するたびに値が増加するため、同じ値が 2 倍になることはありません (ただし、これはスレッドセーフではない可能性があります)。

EDIT : ハッシュ値が計算される場合、このソリューションは任意に 0 から始まるため有効ではありません...

于 2012-07-04T13:20:20.497 に答える
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)
于 2012-07-04T14:17:15.773 に答える