Выполнение заданий на пользовательских классах в python

Я бы хотел использовать встроенный набор классов Python со специальным классом, который я создал. Если я хочу для создания наборов, содержащих экземпляры моего пользовательского класса, какие функции мне нужно реализовать, чтобы я мог выполнять тесты, например set_a - set_b?

Ответы

Ответ 1

Это будет работать из коробки, однако могут быть случаи, когда имеет смысл перегрузить __eq__, __ne__ и __hash__. По умолчанию __eq__ будет сравнивать идентификатор объекта. Возможно, это не то, что вы хотите. В этом случае вам нужно позаботиться о том, чтобы равный объект имел равные хэши, и, в идеале, не равный объект имел разные хэши (хотя это не требуется, это просто уменьшает коллизии). Вы всегда должны использовать __ne__ с помощью __eq__, если у вас нет конкретной причины делать это иначе (это делается для обеспечения логической согласованности).

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

Ответ 2

Если вы хотите поддерживать - операцию для class, вы можете сделать что-то вроде этого:

#!/usr/bin/python

class Test(object):
    def __init__(self, val):
        self.val = val
    def __sub__(self, y):
        return Test(self.val - y.val)

x = Test(10) - Test(5)
print x.val

__sub__ вызывается при выполнении операции -.