#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)