добавить объект в коллекцию наборов python и определить по атрибуту объекта

python set

10746 просмотра

1 ответ

У меня есть такой Personкласс:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return '<Person {}>'.format(self.name)

Я хочу добавить несколько экземпляров этого класса в набор, например так:

tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)

person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>, <Person mary2>}

Как видите, в наборе 2 Мэри. Как сделать так, чтобы Personэкземпляры одного возраста считались одним и тем же человеком и добавлялись в набор только один раз?

Другими словами, как я могу получить результат {<Person tom>, <Person mary>}?

Автор: sashimi Источник Размещён: 12.11.2019 09:15

Ответы (1)


22 плюса

Решение

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

Результатом этого является то , что вам нужно реализовать __hash__(...)и __eq__(...)методы в вашем классе. Например:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.age == other.age

    def __hash__(self):
        return hash(self.age)

    def __repr__(self):
        return '<Person {}>'.format(self.name)

tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)

person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>}

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

Автор: srgerg Размещён: 11.05.2012 07:57
Вопросы из категории :
32x32