eq.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. '''
  2. Операции сравнения и hash - функция
  3. __eq__ - == (противоположный __ne__)
  4. __ne__ - != (противоположный __eq__)
  5. __lt__ - < (противоположный __gt__)
  6. __le__ - <= (противоположный __ge__)
  7. __gt__ - > (противоположный __lt__)
  8. __ge__ - >= (противоположный __le__)
  9. Для сокращения кода можно спользовать @total_ordering
  10. hash() - можно взять только от неизменяемых объектов
  11. Хешируемые объекты могут быть ключами в словарях и элементов множества.
  12. '''
  13. from functools import total_ordering
  14. class OldRectangle:
  15. def __init__(self, a, b):
  16. self.a = a
  17. self.b = b
  18. @property
  19. def area(self):
  20. return self.a * self.b
  21. '''self - левая сторона, other - правая сторона'''
  22. ''' Если делать проверку на !=, то питон вызовет противоположный метод'''
  23. def __eq__(self, other):
  24. print('__eq__ call')
  25. if isinstance(other, OldRectangle):
  26. return self.a == other.b and self.b == other.b
  27. '''метод меньше'''
  28. def __lt__(self, other):
  29. print('__lt__ call')
  30. if isinstance(other, OldRectangle):
  31. return self.area < other.area
  32. if isinstance(other, (int, float)):
  33. return self.area < other
  34. '''Вызовет методы __eq__ и __lt__'''
  35. def __le__(self, other):
  36. return self==other or self<other
  37. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  38. class ChessPlayer:
  39. def __init__(self, name, surname, rating):
  40. self.name = name
  41. self.surname = surname
  42. self.rating = rating
  43. def __eq__(self, other):
  44. if isinstance(other, ChessPlayer):
  45. return self.rating == other.rating
  46. elif isinstance(other, int):
  47. return self.rating == other
  48. else:
  49. return 'Невозможно выполнить сравнение'
  50. def __gt__(self, other):
  51. if isinstance(other, ChessPlayer):
  52. return self.rating > other.rating
  53. elif isinstance(other, int):
  54. return self.rating > other
  55. else:
  56. return 'Невозможно выполнить сравнение'
  57. def __lt__(self, other):
  58. if isinstance(other, ChessPlayer):
  59. return self.rating < other.rating
  60. elif isinstance(other, int):
  61. return self.rating < other
  62. else:
  63. return 'Невозможно выполнить сравнение'
  64. def test_1():
  65. magnus = ChessPlayer('Carlsen', 'Magnus', 2847)
  66. assert magnus.name == 'Carlsen'
  67. assert magnus.surname == 'Magnus'
  68. assert magnus.rating == 2847
  69. ian = ChessPlayer('Ian', 'Nepomniachtchi', 2789)
  70. assert not magnus == 4000
  71. assert ian == 2789
  72. assert not magnus == ian
  73. assert magnus > ian
  74. assert not magnus < ian
  75. assert (magnus < [1, 2]) == 'Невозможно выполнить сравнение'
  76. v1 = ChessPlayer('Гарри ', 'Каспаров', 10)
  77. v2 = ChessPlayer('Бобби', 'Фишер', 20)
  78. v3 = ChessPlayer('Bot', 'Bot', 20)
  79. assert isinstance(v1, ChessPlayer)
  80. assert isinstance(v2, ChessPlayer)
  81. assert v2.__dict__ == {'name': 'Бобби', 'surname': 'Фишер', 'rating': 20}
  82. assert v1.__dict__ == {'name': 'Гарри ', 'surname': 'Каспаров', 'rating': 10}
  83. assert v1 > 5
  84. assert not v1 > 10
  85. assert not v1 > 11
  86. assert not v1 < 5
  87. assert not v1 < 10
  88. assert v1 < 11
  89. assert not v1 == 5
  90. assert v1 == 10
  91. assert not v1 == 11
  92. assert not v1 > v2
  93. assert not v1 == v2
  94. assert v3 == v2
  95. assert not v3 != v2
  96. assert v1 < v2
  97. assert (v1 > 'fdsfd') == 'Невозможно выполнить сравнение'
  98. assert (v1 < 'fdsfd') == 'Невозможно выполнить сравнение'
  99. assert (v1 == 'fdsfd') == 'Невозможно выполнить сравнение'
  100. assert (v1 == [1, 2]) == 'Невозможно выполнить сравнение'
  101. assert (v1 < [1, 2]) == 'Невозможно выполнить сравнение'
  102. print('Good')
  103. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  104. @total_ordering
  105. class Account:
  106. def __init__(self, balance):
  107. self.balance = balance
  108. def __eq__(self, other):
  109. return self.balance == other.balance
  110. def __lt__(self, other):
  111. return self.balance < other.balance
  112. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  113. @total_ordering
  114. class Rectangle:
  115. def __init__(self, width, height):
  116. self.width = width
  117. self.height = height
  118. @property
  119. def area(self):
  120. return self.width * self.height
  121. def __eq__(self, other):
  122. if isinstance(other, Rectangle):
  123. return self.area == other.area
  124. if isinstance(other, (int, float)):
  125. return self.area == other
  126. def __lt__(self, other):
  127. if isinstance(other, Rectangle):
  128. return self.area < other.area
  129. if isinstance(other, (int, float)):
  130. return self.area < other
  131. def main():
  132. test_1()
  133. if __name__ == '__main__':
  134. main()