Реализуйте пользовательскую функцию max - PullRequest
2 голосов
/ 24 января 2020

У меня есть два объекта Point, и код выглядит следующим образом:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

a = Point(1, 3)
b = Point(4, 2)
max(a, b) # Make this output Point(4, 3)

Мой вопрос таков: «Как реализовать пользовательскую функцию max для класса Point, которая вернет Point(max(self.x, other.x), max(self.y, other.y))? " Кажется, что функция max просто смотрит на __lt__ и возвращает самое высокое.

Ответы [ 3 ]

5 голосов
/ 24 января 2020

max() не может этого сделать , он может возвращать только один из элементов, заданных в качестве входных данных, не создает новые экземпляры.

Вам необходимо реализовать свою собственную функцию:

def max_xy_point(*points):
    if not points:
        raise ValueError("Need at least 2 points to compare")
    if len(points) == 1:
        points = points[0]
    return Point(
        max(p.x for p in points),
        max(p.y for p in points)
    )

Как и встроенная функция max(), она может принимать либо одну последовательность (max([p1, p2, p3, ...]), либо отдельные аргументы (max(p1, p2, p3, ...)).

4 голосов
/ 24 января 2020

max(a, b) может вернуть только a или b - не может создать точку с новыми значениями.

Вы можете добавить собственный метод в класс и использовать

c = a.max(b)

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def max(self, other):
        return Point(max(self.x, other.x), max(self.y, other.y))

a = Point(1, 3)
b = Point(4, 2)
c = a.max(b)
print(c.x, c.y)
2 голосов
/ 24 января 2020

Вы можете go примерно так, чтобы получить желаемый результат:

class Point:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def max(self, other):
        if not isinstance(other, Point):
            return NotImplemented
        return Point(max(self.x, other.x), max(self.y, other.y))  

    def __repr__(self):
        return f'Point{self.x, self.y}'


a = Point(1, 3)
b = Point(4, 2)
a.max(b)
# Point(4, 3)
...