У языка программирования Питон есть секретная суперсила с таким же колоссальным названием магические методы Python. Эти операции могут коренным образом изменить способ написания кода с помощью классов Python и представить код, который кажется волшебным для обработки сложной логики. Они более мощные, чем списковые включения, и более захватывающие, чем любой новый линтер PEP8 .

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

Python magic— это методы, которые Питон вызывает от вашего имени в определенных обстоятельствах. Эти операции названы особым образом, чтобы их можно было легко отличить от других процессов Python: им предшествуют и следуют два символа подчеркивания.

class Speaker:
    # This is a magic method
    def __init__(self):
        print("Hello, world!")
# This will call __init__ and print "Hello, world!"
instance = Speaker()

Вот почему magic method Python также называются «методами дандера», что является сокращением от «методов двойного подчеркивания».

В приведенном выше коде вы можете увидеть, что Питон вызывает __init__метод dunder от вашего имени, когда создается новый экземпляр класса.

Использование простого магического метода Python

Если вы когда-либо создавали класс, вы, вероятно, знакомы со следующим методом:

__init__(self, …args) – ClassName()

Вероятно, это самый известный магический метод. Python init действует как конструктор класса. Вы можете использовать это для передачи начальных аргументов в класс Python.

Например, возьмите следующее:

class Speaker:
	message = ""
	def __init__(self, val):
		self.message = val
	   
	def sayIt(self):
		print(self.message)
instance = Speaker("Hello, world!")
instance.sayIt()

Здесь всякий раз, когда Speaker Класс инициализируется, он будет присваиваться self.message переданному значению. Затем мы можем использовать собственный метод «sayIt», который использует файлы self.message.

Очистить экземпляр класса с помощью del

В дополнение к инициализатору класса есть также обработчик удаления класса:

__del__(self) – del instance

Этот метод будет выполняться каждый раз, когда вы вызываете del экземпляр класса. Это особенно полезно, когда есть операция ввода-вывода в конструкторе, чтобы очистить указанные операции ввода-вывода.


import os
class Test:
    def __init__(self):
        f = open("temp.csv", "w")
        f.write("data,more data,testing")
        f.close()
    def __del__(self):
        os.remove('temp.csv')
        print("Cleanup done!")
firstItem = Test()
del firstItem

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

Как программно управлять свойствами класса

Такие вещи, как конструкторы классов и очистка, являются нормой, когда дело доходит до управления классами. Готовы к странным вещам?

Как насчет объявления атрибутов, которые не существуют? 

__getattr__ вы накрыли.

__getattr__(self, key)- instance.property (когда property не существует)

Просто проверьте, что такое ключ поиска (в данном случае со свойством __name) и верните значение, если вы хотите создать новое свойство программно:

код

Также существует немного другой встроенный атрибут getattribute:

пример кода

Обратите внимание, что вместо test.number ожидаемого значения он возвращает файл None.

Это связано с тем, что while __getattr__ разрешает существующие переменные и откатывается к специальному методу, когда ничего не найдено, __getattribute__ запускается первым и не возвращается к существующим значениям в экземпляре класса.

Для того, чтобы __getattribute__ иметь то же поведение, что и __getattr__, нам нужно явно указать Python, чтобы он не попадал в __getattribute__ ловушку, которую мы установили.

Для этого мы можем вызвать super().__getattribute__:

текст кода

Заключение

Переопределение методов Python может повысить уровень логики приложения, уменьшив количество шаблонов, необходимых для выполнения определенных действий, но это не единственный случай использования. Можно использовать волшебные методы, чтобы предоставить API более приятный опыт разработки для разработчиков-потребителей.

Возможно, вам мало представленных в статье волшебных операций. В блоге студии web-разработки YuSMP Group мы уже писали о магических методах, с примерами кода.

Веб-услуги и разработка в YuSMP Group происходит по самым высоким стандартам. Наши специалисты пользуются как и языком программирования Питон, так и другими актуальными технологиям. Посмотрите проекты, которые мы создали, чтобы понять, какого уровня продукты создает компания.