Gibt es eine Möglichkeit, einen "richtigen" Vergleich zu erstellen?
Hintergrund ist der, dass ich gerne Objekte (also Klasseninstanzen) als Keys in Dictionaries verwenden würde.
Mein Ansatz:
Code: Alles auswählen
>>> class Player(object):
def __init__(self, x):
self.x = x
def __cmp__(self, other):
return self.x != other.x
>>> a = Player("Peter")
>>> b = Player("Pan")
>>> c = Player("Peter")
>>> a == a
True
>>> a == b
False
>>> a == c
True
>>> b == c
False
>>> b == a
False
>>> b == b
True
>>> v = {}
>>> v[a] = 0
>>> v[b] = 1
>>> v[c] = 2
>>> v
{<__main__.Player object at 0x011DB410>: 0, <__main__.Player object at 0x011DB450>: 1, <__main__.Player object at 0x011CCBF0>: 2}
>>> v[Player("Peter")]
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
v[Player("Peter")]
KeyError: <__main__.Player object at 0x011DB4D0>
>>>
Ist das ganze überhaupt so möglich?
Edit: Frage selbst beantwortet... Warum finde ich das immer erst zu spät?!
Code: Alles auswählen
>>> def hashText(text):
h = 0
for i, x in enumerate(text):
h += (ord(x) + 1 << i)
return h
>>> hashText("test")
1721
>>> hashText("tset")
1693
>>> class Player(object):
def __init__(self, x):
self.x = x
self.h = hashText(x)
def __cmp__(self, other):
return self.x != other.x
def __hash__(self):
return self.h
>>> a = Player("Peter")
>>> b = Player("Pan")
>>> c = Player("Peter")
>>> a == a
True
>>> a == b
False
>>> a == c
True
>>> b == b
True
>>> v = {}
>>> v[a] = 0
>>> v[b] = 2
>>> v[c] = 1
>>> v
{<__main__.Player object at 0x011CC750>: 1, <__main__.Player object at 0x011CC410>: 2}
>>> v[Player("Peter")]
1