Objekte "richtig" vergleichen lassen
Verfasst: Donnerstag 23. September 2010, 13:44
Hallo.
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:
Wie man sieht funktioniert das nicht so wie gewollt. ``v`` sollte eigentlich nur 1 und 2 beinhalten, da v[c] das v[a] überschreiben _müsste_. Es sollte außerdem möglich sein, ``v[Player("Peter")]`` aufzurufen und dann 2 zu erhalten.
Ist das ganze überhaupt so möglich?
Edit: Frage selbst beantwortet... Warum finde ich das immer erst zu spät?!
Gruß
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