#python #class #object
Вопрос:
Я решил почти все в этом упражнении, кроме раздела пересечения def, где он просит создать новый сектор с пересечением. То, как я это делаю, генерирует кортеж, поэтому, когда я запускаю эту проверку, я получаю ошибку AssertionError, потому что это кортеж, а не строка, как ожидалось в проверке
Я был бы признателен за некоторую помощь в решении этой части.
s2.fr = 60 s2.to = 100 s2.rad = 30 s3 = s1.intersect(s2) assert str(s3)=="60 70 30"
from __future__ import annotations #keep this in because of recursive annotations class Sector: fr: int to: int rad: int def __init__(self): '''Creates a circular sector with from and to angles 0 and radius 0.''' self.fr=0 self.to=0 self.rad=0 def rotate(self, angle: int)-gt; None: '''Rotates sector by the angle. For simplicity, assume that the rotation will result in a sector with fr lt;= to''' self.fr=self.fr angle self.to=self.to angle self.rad=self.rad def intersect(self, other: Sector)-gt; Sector: '''Returns a new sector that is the result of the intersection of this sector with the other one. For simplicity, assume that the two sectors have non-empty intersection (overlap).''' return other.fr,self.to,other.rad def is_empty(self)-gt; bool: '''Returns True if the sector has empty area, otherwise returns False.''' if self.fr self.to !=0: return False else: return True def __eq__(self, other: Sector)-gt; bool: '''Returns True this sector is the same as the other, otherwise False.''' return self.fr == other.fr def __str__(self)-gt; str: '''Returns string "F T R" where F is from angle, T is to, and R is radius.''' my_string =f"{self.fr} {self.to} {self.rad}" return my_string
Комментарии:
1. Не знаю, почему вы удивлены, что ваше утверждение терпит неудачу, когда оно сравнивает кортеж со строкой; это всегда будет неудачным. Вы пробовали преобразовать возврат из intersect в строку, а затем перейти? Или что-нибудь еще?
Ответ №1:
Хороший день,
Насколько я могу судить, в вашем intersect
методе есть изъян. Вы, вероятно, полагаете, что этот метод возвращает новый объект сектора (и ваш комментарий говорит об этом), но на самом деле вы возвращаете кортеж. Поскольку s3 является кортежем, вызов str(s3)
, следовательно, бессмыслен и определенно не вызывает __str__
метод вашего класса (как вы, вероятно, намереваетесь).
Я бы рекомендовал вам изменить intersect
, чтобы вернуть подлинный Sector
. Наличие необязательно дополнительных 🙂 аргументов в вашем __init__
случае поможет в написании элегантного и читабельного colde.
В качестве примечания, на мой взгляд, сравнение объектов на основе их строкового представления сомнительно. Как вы , кажется, знакомы, почему бы не использовать это для «первоначальной» проверки равенства ? __eq__