Неужели не нашлось русских специалистов, чтобы записать курс по пайтону ? Да, можно включить переводчик и слушать с переводом, но это что? Это кто-то считает хорошим и понятным курсом для начинающих? |
Проектирование класса Python. Методы класса
Смотреть на 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 позволяет выполнять операции над рациональными числами в объектном стиле. Синтаксически значительно эффективнее перегрузить операцию "+". Вместо присваивания в форме:

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

Язык 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: