Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
1

Почему если в классе реализован метод __eq__, то объекты класса становятся некэшируемыми?

25.11.2018, 18:29. Показов 866. Ответов 4
Метки нет (Все метки)

То есть к ним нельзя применить функцию hash ()?

++++++++++++++++++++++++++++++++++++

...Друзья! Сам я дойти до этого не могу, у Саммерфильда и Лутца никакого объяснения этому нет, только констатация факта:
По умолчанию все экземпляры классов являются хешируемыми, поэтому для них можно вызывать функцию hash(), использовать их в качестве ключей словаря и сохранять в множествах. Но если будет реализован метод eq (), экземпляры перестанут быть хешируемыми.
(цитата из Саммерфильда)

...Где-то там дано объяснение, что хэшироваться могут только неизменяемые объекты. Ага, если мы в классе реализовали метод __eq__(), то сразу прямо объект от этого стал изменяемым.

В общем, спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2018, 18:29
Ответы с готовыми решениями:

Как в классе Thread реализован вызов run(), если метод run() определён в АВТОРСКОМ классе?
И, следовательно, в классе Thread ничего не известно о вызове run? То есть, ребята, мне пришла в...

Как реализован метод DrawLine и другие, описанные в классе Graphics
На msdn не удосужились описать способ работы методов, там всего-лишь приведён пример...

Почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А?
Поясните пожалуйста, почему если при вызове метода Foo от типа B, в объекте класса FooImp...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же...

4
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
26.11.2018, 19:03  [ТС] 2
Ну что, ребята, будут какие-нибудь мысли? Вообще если поглубже копнуть к функции hash() есть и другие вопросы.
0
559 / 299 / 189
Регистрация: 20.05.2016
Сообщений: 592
26.11.2018, 21:38 3
Метод __eq__(), конечно, не делает объект изменяемым. Просто в нормальных условиях равенство объектов (x == y) подразумевает равенство их хэшей - hash(x) == hash(y). Однако, дефолтный метод __hash__ гарантировано дает разные хэши для различных экземпляров, т.е. хэши объектов совпадают если и только если x is y, независимо от того что там вернет наш собственный __eq__. Когда мы переопределяем метод __eq__, питон сам сбрасывает __hash__ в None, избавляя нас от лишней работы, да и склероз помешает нам добавить в код строку __hash__ = None.
1
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
26.11.2018, 21:59  [ТС] 4
А зачем нам нужно чтобы __hash__ было None? Мы ведь можем переопределить __eq__ и __hash__.
0
559 / 299 / 189
Регистрация: 20.05.2016
Сообщений: 592
26.11.2018, 22:07 5
Можем. Если нам нужен __hash__. А если нет (для тех же изменяемых объектов)? А память наша дырявая как сыр, и лень зверская, и мы, повторю, собственоручно не добавили в код строку __hash__ = None? Поведение экземпляров нашего класса будет неправильным.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2018, 22:07

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.