Раздел «Язык Си».PythonOOPOver:

Перегрузка операторов

Напишем класс Drob для представления дробей вида a/b

class Drob:
   def __init__(self, a, b):
               # a/b
      self.a = a   # числитель
      self.b = b   # знаменатель
      
        # чтобы дробь можно было напечатать
   def __repr__(self):
      return f'{self.a}/{self.b}'

# класс закончился, можно его использовать

d1 = Drob(1, 2)    # создали новую дробь 1/2
print(d1)          # 1/2

d2 = Drob(1, 6)    # создали новую дробь 1/6
print(d6)          # 1/6

Хочу уметь считать дроби, как в математике (1/2 + 1/6)*3/10

Чтобы две дроби умели d1 + d2 нужно определить функцию __add__

class Drob:
   def __init__(self, a, b):
               # a/b
      self.a = a   # числитель
      self.b = b   # знаменатель
      
   def __repr__(self):
      return f'{self.a}/{self.b}'
      
   def __add__(self, other):
      # dres = d1.__add__(d2) когда dres = d1 + d2
      a = self.a
      b = self.b
      c = other.a
      d = other.b
      x = a * d + c * b
      y = b * d

      # не меняем ни дробь self, ни дробь other
      # создаем новую дробь
      res = Drob( x, y)    
 
      return res          # возвращаем эту новую дробь

# класс закончился, можно его использовать

d1 = Drob(1, 2)    # создали новую дробь 1/2
print(d1)          # 1/2

d2 = Drob(1, 6)    # создали новую дробь 1/6
print(d6)          # 1/6

dres = d1 + d2     # dres = d1.__add__(d2)
print(dres)        # 8/12

a = [d1, d2, d3]
print(a)           # [1/2, 1/6, 8/12]
for d in a:
    print(d)

Так же можно написать функцию __lt__ в классе Drob и будет работать оператор <

if d1 < d2:
    print(f'{d1} меньше {d2}')
else:
    print(f'{d1} НЕ меньше {d2}')

Таблица операторов

Арифметические операторы

Оператор Функция
+ __add__
- __sub__
* __mul__
/ __truediv__
// __floordiv__

Операторы сравнения

Оператор Функция
== __eq__
__ne__
< __lt__
__le__
> __gt__
__ge__

Задача 1

Реализовать арифметические операторы и проверить их работу. Варианты:

  1. *
  2. /
  3. -
  4. +

Задача 2

Вычислить значение выражения (1/2 + 1/6) * 3/10

Задача 3

Реализовать логические операторы и проверить их работу. Варианты:

  1. ==
  2. <
  3. >

Задача 4

В файле data.txt даны дроби

4
1/2
1/6
3/4
2/3

-- TatyanaDerbysheva - 25 Feb 2020