dunder_task_2.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # Магические методы сравнения
  2. # __eq__ - ==
  3. # __ne__ - !=
  4. # __lt__ <
  5. # __le__ <=
  6. # __gt__ >
  7. # __ge__ >=
  8. from functools import total_ordering
  9. class Rectangle:
  10. def __init__(self, a, b) -> None:
  11. self.a = a
  12. self.b = b
  13. @property
  14. def area(self):
  15. return self.a * self.b
  16. def __eq__(self, other):
  17. if isinstance(other, Rectangle):
  18. return self.a == other.a and self.b == other.b
  19. def __eq__(self, other):
  20. if isinstance(other, Rectangle):
  21. return self.area < other.area
  22. elif isinstance(other, (int, float)):
  23. return self.area < other
  24. def __le__(self, other):
  25. return self==other or self<other
  26. class Point:
  27. def __init__(self, x, y) -> None:
  28. self.x = x
  29. self.y = y
  30. def __eq__(self, other: object) -> bool:
  31. return isinstance(other, Point) and \
  32. self.x == other.x and self.y == other.y
  33. def __hash__(self):
  34. return hash((self.x, self.y))
  35. @total_ordering
  36. class Fruit:
  37. def __init__(self, name, price):
  38. self.name = name
  39. self.price = price
  40. def __eq__(self, value: object) -> bool:
  41. if isinstance(value, (int, float)):
  42. return self.price == value
  43. elif isinstance(value, Fruit):
  44. return self.price == value.price
  45. else:
  46. raise ValueError
  47. def __lt__(self, value):
  48. if isinstance(value, (int, float)):
  49. return self.price < value
  50. elif isinstance(value, Fruit):
  51. return self.price < value.price
  52. else:
  53. raise ValueError
  54. def main():
  55. apple = Fruit("Apple", 0.5)
  56. orange = Fruit("Orange", 1)
  57. banana = Fruit("Banana", 1.6)
  58. lime = Fruit("Lime", 1.0)
  59. assert (banana > 1.2) is True
  60. assert (banana >= 1.2) is True
  61. assert (banana == 1.2) is False
  62. assert (banana != 1.2) is True
  63. assert (banana < 1.2) is False
  64. assert (banana <= 1.2) is False
  65. assert (apple > orange) is False
  66. assert (apple >= orange) is False
  67. assert (apple == orange) is False
  68. assert (apple != orange) is True
  69. assert (apple < orange) is True
  70. assert (apple <= orange) is True
  71. assert (orange == lime) is True
  72. assert (orange != lime) is False
  73. assert (orange > lime) is False
  74. assert (orange < lime) is False
  75. assert (orange <= lime) is True
  76. assert (orange >= lime) is True
  77. print('Good')
  78. if __name__ == '__main__':
  79. main()