Как рассчитать пересечение 2 секторов в этом объектно-ориентированном примере

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