Питон: мои классы в качестве ключей. как? - PullRequest
8 голосов
/ 07 марта 2011
class A():
   def __init__(self, data=''):
       self.data = data  

   def __str__(self):
       return str(self.data)

d = {}  
elem = A()  
d[elem] = 'abc'  

elem2 = A()
print d[elem2]    # KeyError  
# actually elem2! was used not elem

как я могу реализовать это без ошибок?

EDIT:
FFFUUU, ошибка была:
Я пытался получить d[elem2] (не elem) с другим экземпляром A () НО с тем же содержимым. (позор мне)
Все еще .. как я могу это сделать? переопределить __hash__?

Ответы [ 2 ]

10 голосов
/ 07 марта 2011

Ответ - да, вам нужно переопределить __hash__():

>>> class A(object):
...   def __init__(self, data=''):
...     self.data = data
...   def __eq__(self, another):
...     return hasattr(another, 'data') and self.data == another.data
...   def __hash__(self):
...     return hash(self.data)
... 
>>> a1, a2, a3 = A('foo'), A('foo'), A('bar')
>>> d = {a1: 'foo'}
>>> d[a1]
'foo'
>>> d[a2]
'foo'
>>> d[a3]
Traceback (most recent call last):
  File "", line 1, in 
KeyError: __main__.A object at 0x927d0>

Как объяснено в другом комментарии, реализация по умолчанию __hash__ - это просто простая идентификация, поэтому, если вы хотите сделать ее более сложной, вам нужно определить ее явно.

4 голосов
/ 07 марта 2011

То, что вы сделали, должно работать, если вы не переопределите методы __hash__() и __eq__(). Он будет использовать идентичность объекта как равенство. Если вам нужно другое понятие равенства, вы можете переопределить методы __hash__() и __eq__() вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...