Магия вне Хогвартса: рассказываем о том, что такое Python 3 магические методы в блоге студии web-разработки YuSMP Group. В языке программирования существуют специальные приемы, которые упрощают работу с кодом. Каждая конструкция обозначается словом, которое начинается и заканчивается двойным подчеркиванием, например, __add__.

Их также называют методами Дандера. Python магические методы класса не предназначены для непосредственного вызова разработчиком, но вызов происходит внутри класса при определенном действии. Например, когда вы добавляете два числа с помощью оператора внутри __add__() будет вызываться соответствующий прием.

Магические методы Python: список популярных конструкций

Магический метод add Python

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

Как видите, при выполнении num+10 оператор + вызывает __add__(10). Вы также можете вызвать num.__add__(5) напрямую, что даст тот же результат. Однако, как упоминалось ранее, такие приемы не предназначены для прямого вызова, а внутренне, через некоторые другие действия.

Такие конструкции чаще всего используются для определения перегруженного поведения предопределенных операторов в Python. Например, арифметические операторы по умолчанию работают с числовыми операндами. Это означает, что числовые объекты должны использоваться вместе с такими операторами, как +, -, *, / и т. д. Оператор + также определяется как оператор конкатенации в классах строк, списков и кортежей. Можно сказать, что оператор + перегружен.

Чтобы сделать перегруженное поведение доступным в вашем собственном классе, соответствующий прием должен быть переопределен. Например, чтобы использовать оператор + с объектами определенного пользователем класса, он должен включать в себя __add__().

Давайте посмотрим, как реализовать и использовать некоторые из важнейших конструкций в нашем контексте.

Магический метод new Python

В таких языках, как Java и C#, оператор new используется для создания нового экземпляра класса. В Python __new__() неявно вызывается перед __init__() методом. Конструкция  __new__() возвращает новый объект, который затем инициализируется с помощью __init__().

class Employee:
    def __new__(cls):
        print ("__new__ magic method is called")
        inst = object.__new__(cls)
                return inst
    def __init__(self):
        print ("__init__ magic method is called")
        self.name='Satya'

В приведенном выше примере будет получен следующий вывод при создании экземпляра Employee класса.

>>> emp = Employee()

__new__ вызывается магический метод

__init__ вызывается магический метод

Таким образом, __new__() вызывается перед __init__().

Магический метод str Python

Еще одна полезная конструкция — __str__(). Она необходима, чтобы возвращать печатное строковое представление любого определяемого пользователем класса. Мы видели str()встроенную функцию, которая возвращает строку из параметра объекта. Например, str(12)возвращает «12». 

При вызове он вызывает __str__() в классе int.

Давайте теперь переопределим __str__() в классе Employee, чтобы он возвращал строковое представление его объекта.

class Employee:
    def __init__(self):
        self.name='Swati'
        self.salary=10000
    def __str__(self):
        return 'name='+self.name+' salary=$'+str(self.salary)

Посмотрите, как str () функция внутренне вызывает __str__() метод, определенный в классе Employee. Вот почему это называется волшебным методом!

__ge__() метод

В класс расстояния добавлен следующий метод для перегрузки >=оператора.

Пример: __ge__()

class distance:
    def __init__(self, x=None,y=None):
        self.ft=x
        self.inch=y
    def __ge__(self, x):
        val1=self.ft*12+self.inch
        val2=x.ft*12+x.inch
        if val1>=val2:
            return True
        else:
            return False

Этот прием вызывается при использовании >=оператора и возвращает значение True или False. Соответственно, может отображаться соответствующее сообщение.

Магический метод lt python

__lt__ — это одна из конструкций, которая используется для определения или реализации функциональности оператора «меньше чем» «<». Он возвращает логическое значение в соответствии с условием, т. е. возвращает true, если a<b, где a и b — объекты класса .

Синтаксис: __lt__(я, объект)

  • self: ссылка на объект.
  • obj: это объект, который в дальнейшем будет сравниваться с другим объектом.                 

Возвращает: возвращает True или False в зависимости от сравнения.

Примечание. Мы можем вернуть любой тип значения из метода __lt__, а позже мы можем преобразовать его в логическое значение с помощью встроенного метода bool() , т.е.

Магический метод call python

Метод Python __call__ делает класс вызываемым, поэтому вы можете вызывать объекты класса как обычную функцию. Например, если вы определяете __call__(self) объект x класса X, вы можете назвать его так: x(). Возвращаемое значение вызываемого объекта является возвращаемым значением __call__() метода.

Следующий фрагмент кода делает пользовательский класс Person доступным для вызова, предоставляя реализацию магического метода __call__(), который принимает два аргумента:

  • self — ссылка на сам объект. Он автоматически передается в функцию Python — вам не нужно указывать аргумент самостоятельно.
  • other — дополнительный аргумент (например, строка) для предоставления пользовательского приветствия.

С помощью этой реализации мы теперь можем создать вызываемый объект alice и вызывать его следующим образом: alice().

class Person:
    def __call__(self, other):
        return f'Hi {other}'


alice = Person()
print(alice('Bob'))
# Hi Bob

Магический метод enter python и магический метод exit python

Python вызывает __enter__() при запуске with блока, тогда как __exit__() вызывается в конце. Объект, реализующий приемы __enter__() и __exit__(), называется менеджером контекста.Определив эти конструкции, вы можете создать свой собственный контекстный менеджер.

Класс MySecretConnection:
def init ( я, URL ) :
self.url = URL-адрес
защита enter ( самостоятельно ) :
печать ( 'вход' , self.url )
def exit ( self, exc_type, exc_val, exc_tb ) :
print ( 'уходя' , self.url )
с MySecretConnection как finxter:
# Вызывается finxter.__enter__()
проходить
# Вызывается finxter.__exit__()
  • Мы определяем пользовательский класс MySecretConnection. Это может удерживать любое соединение в вашем скрипте Python, поэтому вы можете легко очистить веб-сайт или сделать все, что захотите.
  • Определяем __enter__() и __exit__() magic, чтобы сделать класс MySecretConnection менеджером контекста, т. е. разрешить его использование в with операторе.
  • Создаем with оператор, назначая конкретный экземпляр MySecretConnection, который подключается к нашему приложению — головоломке Python, переменной finxter.

Резюме

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