Может ли конструктор класса вернуть другой класс в Python? - PullRequest
1 голос
/ 01 мая 2020

Я сейчас играю с 2D геометрией. Я создал два класса: Point и LineSegment:

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

class LineSegment:
    def __init__(self, p1: Point, p2: Point):
        self.p1 = p1
        self.p2 = p2

Интересный случай - LineSegment(p1, p1) - отсюда отрезок линии нулевой длины. По сути, это просто точка p1. Но это типа LineSegment.

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

class LineSegment:
    def __init__(self, p1: Point, p2: Point):
        self.p1 = p1
        self.p2 = p2

    def simplify(self):
        if self.p1 == self.p2:
            return self.p1
        return self

Хотя это, вероятно, очень плохая идея, я все еще любопытно: Можно ли заставить конструктор класса LineSegment вернуть объект класса Point?

1 Ответ

2 голосов
/ 01 мая 2020

Да, хотя не конструктор __init__(), а экземпляр __new__().

class LineSegment:
    def __new__(cls, p1: Point, p2: Point):
        # Using "is" here since Points are mutable, but that's just personal preference
        if p1 is p2:
            return p1
        return super().__new__(cls)

    def __init__(self, p1: Point, p2: Point):
        self.p1 = p1
        self.p2 = p2

a = Point(0, 0)
b = Point(1, 1)
print(LineSegment(a, b))  # <__main__.LineSegment object at ...>
print(LineSegment(a, a))  # <__main__.Point object at ...>

Примечание, из документов

Если __new__() не возвращает экземпляр cls , то метод __init__() нового экземпляра вызываться не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...