А теперь модернизируем уже новый класс PatchedPoint
. Реализуйте магические методы _str__ и _repr__.
При преобразовании в строку точка представляется в формате (x, y)
.
Репрезентация же должна возвращать строку для инициализации точки двумя параметрами.
Примечание
Ваше решение должно содержать только классы и функции.
В решении не должно быть вызовов инициализации требуемых классов.
Пример
Ввод
point = PatchedPoint()
print(point)
point.move(2, -3)
print(repr(point))
Вывод
(0, 0)
PatchedPoint(2, -3)
Ввод
first_point = PatchedPoint((2, -7))
second_point = PatchedPoint(7, 9)
print(*map(str, (first_point, second_point)))
print(*map(repr, (first_point, second_point)))
Вывод
(2, -7) (7, 9)
PatchedPoint(2, -7) PatchedPoint(7, 9)
Решение
Эта задача знакомит нас с волшебными методами __str__ и __repr__.
Оба метода преобразует наш объект в удобочитаемый человеком формат. Так в чем же принципиальная разница между ними? Зачем потребовалось делать два разных метода?
Если сформулировать максимально просто, то метод __str__ это то, как должен увидеть объект при выводе пользователь, в то время как __repr__ то, как должен задавать объект разработчик, если хочет получить точно такой же объект. Обратите внимание, что если __repr__ не определен, то вместо него автоматически вызовется __str__.
Посмотреть код
Решение
class Point:
def __init__(self, x, y) -> None:
self.x = x
self.y = y
def move(self, new_x, new_y):
self.x += new_x
self.y += new_y
def length(self, point):
result = ((point.x - self.x) ** 2 + (point.y - self.y) ** 2) ** 0.5
return round(result, 2)
class PatchedPoint(Point):
def __init__(self, *args) -> None:
match len(args):
case 0:
self.x = 0
self.y = 0
case 1:
self.x, self.y = args[0]
case 2:
self.x, self.y = args
def __str__(self) -> str:
string = f'({self.x}, {self.y})'
return string
def __repr__(self) -> str:
string = f'PatchedPoint({self.x}, {self.y})'
return string
Решение
class Point:
def __init__(self, x, y) -> None:
self.x = x
self.y = y
def move(self, new_x, new_y):
self.x += new_x
self.y += new_y
def length(self, point):
result = ((point.x - self.x) ** 2 + (point.y - self.y) ** 2) ** 0.5
return round(result, 2)
class PatchedPoint(Point):
def __init__(self, *args) -> None:
match len(args):
case 0:
super().__init__(0, 0)
case 1:
super().__init__(*args[0])
case 2:
super().__init__(*args)
def __str__(self) -> str:
string = f'({self.x}, {self.y})'
return string
def __repr__(self) -> str:
string = f'PatchedPoint({self.x}, {self.y})'
return string