Создание пользовательского класса QPointF

#python #class #pyqt #point

#python #класс #pyqt #точка

Вопрос:

Я хочу создать свой класс Point с методом вычисления евклидова расстояния. Класс Point наследуется от класса QPointF. Но при выполнении таких операций, как add или mul, результатом является не класс Point, а QPointF. Как это исправить? Должен ли я перезаписать все магические методы или есть другое решение?

 from PyQt5.QtCore import QPointF


class Point(QPointF):
    def __init__(self, *args, **kwargs):
        super(QPointF, self).__init__(*args, **kwargs)

    def dist(self):
        return (self._p.x() * self._p.x()  
                self._p.y() * self._p.y()) ** 0.5

 a = Point(1, 2)
 b = Point(2, 3)
 print(a   b, type(a   b))

>> PyQt5.QtCore.QPointF(3.0, 5.0) <class 'PyQt5.QtCore.QPointF'>
  

Ответ №1:

Да, вам придется перезаписать методы __add__ , __mul__ и __repr__ :

 from PyQt5.QtCore import QPointF

class Point(QPointF):
    def dist(self):
        return (self._p.x() * self._p.x()   self._p.y() * self._p.y()) ** 0.5

    def __add__(self, other):
        return self.__class__(super(self.__class__, self).__add__(other))

    def __mul__(self, other):
        return self.__class__(super(self.__class__, self).__mul__(other))

    def __repr__(self):
        return "{}({}, {})".format(self.__class__.__name__, self.x(), self.y())

if __name__ == '__main__':
    a = Point(1, 2)
    b = Point(2, 3)
    print(a, type(a))
    print(b, type(b))
    print(a   b, type(a   b))
    a  = Point(10, 10)
    print(a, type(a))
    a  = QPointF(10, 10)
    print(a, type(a))
    print(a*3, type(a*3))
    print("a: {}".format(a))
    l = [a, b]
    print(l)