Доброго времени суток, читатели, зрители моего канала programmer's notes.
Теперь в Дзен есть Подборки. Данная статья относится к подборке
Это приложение к уроку
Магические методы в Python
Немного необычное приложение. Оно не повторяет и не расширяет урок 9. Это справочный материал к уроку, но с примерами.
Системные магические методы
__init__() — конструктор, запускается после создания объекта.
__new__() — конструктор, запускается перед созданием объекта.
__del__() — деструктор, запускается перед удалением объекта.
__init_subclass__() — запускается в родительском классе, при создании объекта дочернего класса.
Пример программы с использованием всех указанных методов
Результат выполнения программы
<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__() — оператор ">=".
Ниже представлен пример, показывающий класс, где представлено упрощённое сравнение строк.
Результат работы программы
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__() — двоичное "ИЛИ", "|", значение слева от оператора.
Ниже представлена программа, в которой реализован класс "точка". Для точки можно осуществлять такую операцию как сложение. Складываются координаты точки.
Результат выполнения программы
[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__() — конец блока контекстного менеджера.
Ниже представлена программа с классом, имеющим некоторые свойства последовательности — целое число, как последовательность разрядов.
Результат выполнения программы
1 2 3
1 6 3
Замечание
В представленном выше материале перечислены большинство магических методов, которые можно использовать, если вы программируете на Python. Некоторый материал, который здесь имеется, покажется вам не знакомым. Он не вошёл в наш базовый курс. Но я надеюсь осветить его в продолжении данного и последующих курсов по Python.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.