Найти - Пользователи
Полная версия: дефолтные __hash__() и __eq__()
Начало » Python для новичков » дефолтные __hash__() и __eq__()
1
qwertun
Добрый день

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

def __hash__(self):
return hash(tuple(vars(self).values()))

вместо дефолтной?

и вот еще, как работает дефолтный __eq__() ? что-то на подобии

def __eq__(self, other):
if not isinstance(other, self.__class__):
return False

return vars(self) == vars(other)
py.user.next
На нехешируемых значениях hash() выпадает.
>>> class A:
...     def __init__(self):
...         self.i = []
...     def __hash__(self):
...         print(vars(self).values())
...         return hash(tuple(vars(self).values()))
... 
>>> hash(A())
dict_values([[]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __hash__
TypeError: unhashable type: 'list'
>>>

Если можешь собрать из объекта уникальный кортеж хешируемых объектов, то можно возвращать его хеш.

qwertun
и вот еще, как работает дефолтный __eq__() ? что-то на подобии
>>> class A:
...   pass
... 
>>> a1, a2 = A(), A()
>>> a1 == a1
True
>>> a1 == a2
False
>>>
Походу, через id() он работает.
Rodegast
> подскажите пожалуйста, сильно ли плохо будет использовать реализацию вида

Конечно плохо. Выбери несколько значений в качестве ключа хеширования и используй их, а не весь объект.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB