Метод __hash__ в ООП в Python
Объекты с переопределенным методом
__eq__ нельзя положить в
множество, пока у класса нет
метода __hash__. Множество в Python
задают литералом {...} или функцией
set.
Пусть у нас есть класс User
с методом __eq__:
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if not isinstance(other, User):
return False
return self.name == other.name and self.age == other.age
Попытка создать множество из таких объектов
выдаст ошибку. Добавим метод __hash__
на основе тех же полей, что и в
__eq__:
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if not isinstance(other, User):
return False
return self.name == other.name and self.age == other.age
def __hash__(self):
return hash((self.name, self.age))
Проверим:
user1 = User('john', 25)
user2 = User('john', 25)
users = {user1, user2}
print(len(users)) # выведет 1
Сделайте класс Employee с именем
и зарплатой. Реализуйте __eq__
и __hash__, чтобы объекты
можно было хранить в множестве.