Как переопределить или выполнить мин / макс в Python на вашем собственном классе? - PullRequest
0 голосов
/ 14 ноября 2018

Не уверен, что лучший способ дать название этому вопросу, но как я могу переопределить или выполнить min(a, b) или max(a, b) для объектов класса, который я создал?Я могу переопределить gt и lt, как показано ниже, но я бы хотел переопределить min или max, чтобы я мог использовать что-то вроде max(a, b, c ,d).Класс также будет иметь несколько свойств, но я думаю, что для этого примера достаточно 2.

class MyClass:
    def __init__(self, item1, item2):
        self.item1 = item1
        self.item2 = item2

    def __gt__(self, other):
        if isinstance(other, MyClass):
            if self.item1 > other.item1:
                return True
            elif self.item1 <= other.item1:
                return False
            elif self.item2 > other.item2:
                return True
            elif self.item2 <= other.item2:
                return False

    def __lt__(self, other):
        if isinstance(other, MyClass):
            if self.item1 < other.item1:
                return True
            elif self.item1 >= other.item1:
                return False
            elif self.item2 < other.item2:
                return True
            elif self.item2 >= other.item2:
                return False

Пример:

a = MyClass(2,3)
b = MyClass(3,3)

print(a > b)
# False

Я попытался переопределить __cmp__, но это не похожеработа.

Хотел бы иметь возможность сделать max(a, b) и вернуть b объект

1 Ответ

0 голосов
/ 14 ноября 2018

Просто переопределите магические методы сравнения

class A(object):

    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        return self.value < other.value

    def __lt__(self, other):
        return self.value <= other.value

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

    def __ne__(self, other):
        return self.value != other.value

    def __gt__(self, other):
        return self.value > other.value

    def __ge__(self, other):
        return self.value < other.value

    def __str__(self):
        return str(self.value)

a = A(10)
b = A(20)
min(a, b)
...