Найти тему
programmer's notes (python and more)

ООП на Python. Магические методы. Приложение к уроку 9

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Теперь в Дзен есть Подборки. Данная статья относится к подборке

ООП в Python

Это приложение к уроку

Магические методы в Python

Немного необычное приложение. Оно не повторяет и не расширяет урок 9. Это справочный материал к уроку, но с примерами.

Системные магические методы

__init__() — конструктор, запускается после создания объекта.
__new__() — конструктор, запускается перед созданием объекта.
__del__() — деструктор, запускается перед удалением объекта.
__init_subclass__() — запускается в родительском классе, при создании объекта дочернего класса.

Пример программы с использованием всех указанных методов

Текст программы см. ниже
Текст программы см. ниже
primer216.py

Результат выполнения программы

<class '__main__.class2'>
<class '__main__.class3'>
Перед созданием объекта
Конструктор class1
Конструктор класс class3
Деструктор класса class2

Я намеренно во-первых, взял в цепочке наследования целых три класса, во-вторых, несколько запутал ситуацию, чтобы интересно было разбираться.

1. __init_subclass__(), как мы видим запускается вверх по цепочке наследования для каждого из классов.

2. Обратим внимание, что в классе class2 не определен метод __init__() (конструктор). В классе __init__() родительского класса запускается с помощью функции super(). Функция реализует алгоритм, по которому она ищет нужный метод вверх по цепочке наследования и запускает первый найденный.

3. Метод __del__() (деструктор) запускается в данном случае из класса class2, поскольку в классе class3 его нет.

4. Метод __new__() в нашем случае запускается в верхнем класс иерархии и вызывает такой же метод в классе, от которого наследуют все класс - object. В общем случае он абсолютно не нужен, так как такой запуск осуществляется автоматически.

Магические методы сравнения

Эти методы позволяют перегрузить стандартные операторы сравнения, так чтобы использовать их с объектами данного класса.

__lt__() — оператор "<".
__le__() — оператор "<=".
__eq__() — оператор "==".
__ne__() — оператор "!=".
__gt__() — оператор ">".
__ge__() — оператор ">=".

Ниже представлен пример, показывающий класс, где представлено упрощённое сравнение строк.

Текст программы см. ниже
Текст программы см. ниже
primer217.py

Результат работы программы

True
False
True

Магические методы перегрузки арифметических операторов

Перегрузить арифметические операторы можно следующими магическими методами.

Арифметика

__invert__() — унарный оператор инвертирования битов "~".
__neg__() — унарный оператор отрицания (знак "-" перед числом).
__pos__() — унарный оператор "+" (знак "+" перед числом).
__add__() — сложение, изменяемый объект слева от знака "+".
__sub__() — вычитание, изменяемый объект слева от знака "-".
__mul__() — умножение, изменяемый объект слева от знака "*".
__truediv__() — деление, изменяемый объект слева от знака "/".
__floordiv__() — целочисленное деление, изменяемый объект слева от знака "//".
__mod__() — остаток от деления, изменяемый объект слева от знака "%".
__pow__() — возведение в степень, изменяемый объект слева от знака "**".
__radd__() — сложение, изменяемый объект справа от знака "+".
__rsub__() — вычитание, изменяемый объект справа от знака "-". __rmul__() — умножение, изменяемый объект справа от знака "*". __rtruediv__() — деление, изменяемый объект справа от знака "/". __frloordiv__() — целочисленное деление, изменяемый объект справа от знака "//".
__rmod__() — остаток от деления, изменяемый объект справа от знака "%".
__rpow__() — возведение в степень, изменяемый объект справа от знака "**".

Арифметика. Действие с присвоением

__iadd__() — сложение с присвоением "+=".
__isub__() — вычитание с присвоением "-=".
__imul__() — умножение с присвоением "*=".
__itruediv__() — деление с присвоением "/=".
__ifloordiv__() — целочисленное деление с присвоением "//=".
__imod__() — остаток от деления с присвоением "%=".
__ipow__() — возведение в степень с присвоением "**=".

Арифметика. Сдвиговые операции

__lshift__() — двоичный сдвиг влево "<<", значение справа от оператора.
__rshift__() — двоичный сдвиг вправо ">>", значение справа от оператора.
__and__() — двоичное "И", "&", значение справа от оператора.
__xor__() — исключающее "ИЛИ", "^", значение справа от оператора.
__or__() — двоичное "ИЛИ", "|", значение справа от оператора.
__rlshift__() — двоичный сдвиг влево "<<", значение слева от оператора.
__rrshift__() — двоичный сдвиг вправо ">>", значение слева от оператора.
__rand__() — двоичное "И", "&", значение слева от оператора.
__rxor__() — исключающее "ИЛИ", "^", значение слева от оператора. __ror__() — двоичное "ИЛИ", "|", значение слева от оператора.

Ниже представлена программа, в которой реализован класс "точка". Для точки можно осуществлять такую операцию как сложение. Складываются координаты точки.

Текст программы см. ниже
Текст программы см. ниже
primer217.py

Результат выполнения программы

[0,0]
[1,3]
[5,9]

Метод __str__() обеспечивает вывод значения объекта "точка".

Магические методы перегрузки функций

В python много глобальных функций, выполняющих самые разные действия. Часть из них можно реализовать с помощью магических методов.

__bytes__() — даёт возможность реализовать свою функцию bytes().
__format__() — реализация глобальной функции format().

Преобразование типов
__complex__() — реализация функции complex().
__int__() — реализация функции int().
__float__() — реализация функции float().
__index__() — реализация метода index().
__round__() — реализация функции round().

Если класс реализует последовательность
__len__() — для реализации глобальной функции len().
__getitem__() — если класс реализует последовательность, то данный метод позволяет обращаться к элементу по индексу.
__setitem__() — а это для присвоения элементу последовательности.
__delitem__() — вызывается при удалении элемента последовательности.
__missing__() — вызывается если значения в последовательности не существует.
__iter__() — для реализации функции iter().
__reversed__() — для реализации функции reversed().
__contains__() — при проверке принадлежности элемента последовательности.

Магические методы атрибутов объекта
__getattr__() — реализация глобальной функции getattr().
__setattr__() — реализация глобальной функции setattr().
__delattr__() — для обработки удаления атрибута.
__dir__() — для реализации глобальной функции.

Контекстные менеджеры
__enter__() — начала блока контекстного менеджера.
__exit__() — конец блока контекстного менеджера.

Ниже представлена программа с классом, имеющим некоторые свойства последовательности — целое число, как последовательность разрядов.

Текст программы см. ниже
Текст программы см. ниже
primer218.py

Результат выполнения программы

1 2 3
1 6 3

Замечание
В представленном выше материале перечислены большинство магических методов, которые можно использовать, если вы программируете на Python. Некоторый материал, который здесь имеется, покажется вам не знакомым. Он не вошёл в наш базовый курс. Но я надеюсь осветить его в продолжении данного и последующих курсов по Python.

Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Программировать очень просто: берём язык программирования и пишем на нём программу
Программировать очень просто: берём язык программирования и пишем на нём программу