НОЧУ ДПО "Национальный открытый университет "ИНТУИТ"
Опубликован: 24.01.2021 | Доступ: свободный | Студентов: 1229 / 21 | Длительность: 03:57:00
Лекция 22:

Проектирование класса Python. Методы класса

< Лекция 1 || Лекция 22: 123

Смотреть на youtube

На прошлой лекции мы начали проектирование класса, определяющего тип данных - рациональные числа. На этом этапе мы определили поля класса, конструктор класса и переопределили функцию __str__, наследуемую от родительского класса object. Построенный код позволяет клиентам класса создавать объекты проектируемого типа и выводить на печать методом print значения объектов в приемлемом формате.

Приведу построенный код, который будем пополнять в этой лекции:

class classRational():
    """
    Класс Rational.
	/// определяет новый тип данных - рациональные числа и основные
	/// операции над ними - сложение, умножение, вычитание и деление.
	/// Рациональное число задается парой целых чисел (m,n) и изображается,
	/// обычно в виде дроби m/n. Число m называется числителем, а 
	/// n - знаменателем. Для каждого рационального числа существует 
	/// множество его представлений, например 1/2, 2/4, 3/6, 6/12 -
	/// задают одно и тоже рациональное число. Среди всех представлений
	/// можно выделить то, в котором числитель и знаменатель взаимно 
	/// несократимы. Такой представитель будет храниться в полях класса.
	/// Операции над рациональными числами определяются естественным 
	/// для математиков образом. 
    """
    #поля класса
    # int m - числитель
    # int n - знаменатель
    def __init__(self,  m = 0, n = 1):
        """
        Конструктор класса. Создает рациональное число
	      m/n со взаимно несократимыми
	      числителем и знаменателем. 
          Параметры m, n - целые числа.
          Значения по умолчанию задают 
          рациональный ноль.
        """    
        #приведение знака
        if n < 0:
            m, n = -m, - n
        #приведение к несократимой дроби
        a, b = m, n
        if a < 0: 
            a = -a
        if a < b:
            a, b = b, a
        while b != 0:
            a, b = b, a % b
        d = a
        self.m = m // d
        self.n = n // d
        
    def __str__(self):
        """
        Переопределение встроенной функции __str__
        """
        return str(self.m) + "/" + str(self.n) 

Перейдем теперь к заданию методов класса, определяющих поведение объектов. Для рациональных чисел это операции, которые можно выполнять над этими числами. Начнем со сложения и определим метод Plus, позволяющий сложить два рациональных числа и получить в результате новое рациональное число. Вот его определение на Python:

    def Plus(self, r):
        """
        Сложение рациональных чисел
        """
        u = self.m * r.n + self.n * r.m
        v = self.n * r.n
        return classRational(u, v)
    

У метода два аргумента. Первым аргументом является текущий объект, имя которого фиксировано - self. Напомню, в других языках - С++, C#, Java - фиксированное имя текущего объекта - это this. Аргумент r задает слагаемое, прибавляемое к текущему объекту. Тип аргумента не задается в Pythonи успех операции обеспечивается лишь в том случае, если у фактического аргумента, передаваемого методу Plus будут атрибуты m и n, в противном случае возникнет исключительная ситуация, требующая обработки в процессе выполнения. Успех гарантируется, если второй аргумент действительно является рациональным числом.

Метод Plus позволяет выполнять операции над рациональными числами в объектном стиле. Синтаксически значительно эффективнее перегрузить операцию "+". Вместо присваивания в форме:

r5 = r1.Plus(r2)

рекомендуется использовать форму, привычную при работе с числами:

r6 = r3 + r4.

Язык Pythonпозволяет выполнять перегрузку всех знаков операций, применяемых при работе с числами. Но поскольку перегрузки в языке Pythonнет, то перегрузка знаков операций моделируется переопределением методов, соответствующих каждому знаку операции. Покажем, как это делается, на примере операции "+":

  def __add__(self, r ):
        """
        Переопределение операции +
        """
        return self.Plus(r)
    

В определении использован созданный метод Plus. Клиент класса может по желанию использовать любую форму выполнения операции сложения. Вот пример:

def test5():    
    global r5, r6
    r5 = r1.Plus(r2)
    r6 = r3 + r4
    print("r5 = ", r5)
    print("r6 = ", r6)

Вот результаты работы двух тестов - test1, test5, создающих глобальные переменные: r1 - r6:


< Лекция 1 || Лекция 22: 123
Елена Лаптева
Елена Лаптева

Думаю. что не смогу его закончить. Хотелось предупредить других - не тратьте зря время, ищите другой курс.

Михаил Сидоров
Михаил Сидоров

Если S - последовательность, то срез задается как S(i : j) и содержит j - i элементов,

а в примере используютс другие скобки - 

NL[1:3] = ["решили", "не", "искать"]

или это не срез, тогда, что это?