Базовые магические методы

PythonPythonIntermediate
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом уроке мы изучим базовые магические методы в Python. Магические методы, также известные как "dunder" методы (методы с двумя нижними подчеркиваниями), позволяют определить, как объекты Python ведут себя в определенных ситуациях, что позволяет выполнять продвинутую и настраиваемую манипуляцию с объектами.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/constructor("Constructor") python/ObjectOrientedProgrammingGroup -.-> python/polymorphism("Polymorphism") python/ObjectOrientedProgrammingGroup -.-> python/encapsulation("Encapsulation") subgraph Lab Skills python/function_definition -.-> lab-7836{{"Базовые магические методы"}} python/classes_objects -.-> lab-7836{{"Базовые магические методы"}} python/constructor -.-> lab-7836{{"Базовые магические методы"}} python/polymorphism -.-> lab-7836{{"Базовые магические методы"}} python/encapsulation -.-> lab-7836{{"Базовые магические методы"}} end

Инициализация и представление объектов

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

__init__

Метод __init__ вызывается при создании объекта. Он используется для инициализации атрибутов объекта.

Начнем с простого объекта. В файле person.py создайте класс Person, который имеет два атрибута.

class Person:
    def __init__(self, name: str, age: int):
        """
        Initialize the Person object with a name and age.

        :param name: The name of the person.
        :param age: The age of the person.
        """
        self.name = name
        self.age = age

__str__

Метод __str__ вызывается встроенной функцией str() и функцией print() для получения строкового представления объекта, понятного для человека.

    #... (предыдущий код в person.py)

    def __str__(self) -> str:
        """
        Return a human-readable string representation of the Person object.

        :return: A string describing the person.
        """
        return f"{self.name} is {self.age} years old."

__repr__

Метод __repr__ вызывается встроенной функцией repr() и используется в интерактивном интерпретаторе для получения строкового представления, которое, если возможно, может быть использовано для восстановления объекта.

    #... (предыдущий код в person.py)

    def __repr__(self) -> str:
        """
        Return a string representation of the Person object that can be used to recreate the object.

        :return: A string in the format 'Person(name, age)'.
        """
        return f"Person('{self.name}', {self.age})"

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

Теперь, когда мы определили базовые магические методы для нашего класса Person, посмотрим, как они работают в init_repr_example.py:

from person import Person

## Create a new Person object
p = Person("Alice", 30)

## Use the __str__ method with the print function
print(p)  ## Output: Alice is 30 years old.

## Use the __repr__ method in the interactive interpreter
print(repr(p))  ## Output: Person('Alice', 30)

Затем введите следующую команду в терминале для выполнения скрипта.

python init_repr_example.py

Сравнение объектов

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

__eq__

Метод __eq__ используется для определения, равны ли два объекта. Он вызывается оператором ==.

    #... (предыдущий код в person.py)

    def __eq__(self, other: "Person") -> bool:
        """
        Compare two Person objects for equality.

        :param other: The other Person object to compare with.
        :return: True if both objects have the same name and age, False otherwise.
        """
        if isinstance(other, Person):
            return self.name == other.name and self.age == other.age
        return False

__ne__

Метод __ne__ используется для определения, не равны ли два объекта. Он вызывается оператором !=.

    #... (предыдущий код в person.py)

    def __ne__(self, other: "Person") -> bool:
        """
        Compare two Person objects for inequality.

        :param other: The other Person object to compare with.
        :return: True if the objects have different names or ages, False otherwise.
        """
        return not self.__eq__(other)

__lt__

Метод __lt__ используется для определения, меньше ли один объект другого. Он вызывается оператором <.

    #... (предыдущий код в person.py)

    def __lt__(self, other: "Person") -> bool:
        """
        Compare two Person objects to see if one is less than the other based on age.

        :param other: The other Person object to compare with.
        :return: True if the current object's age is less than the other object's age, False otherwise.
        """
        if isinstance(other, Person):
            return self.age < other.age
        return NotImplemented

__le__

Метод __le__ используется для определения, меньше или равен ли один объект другому. Он вызывается оператором <=.

    #... (предыдущий код в person.py)

    def __le__(self, other: "Person") -> bool:
        """
        Compare two Person objects to see if one is less than or equal to the other based on age.

        :param other: The other Person object to compare with.
        :return: True if the current object's age is less than or equal to the other object's age, False otherwise.
        """
        if isinstance(other, Person):
            return self.age <= other.age
        return NotImplemented

__gt__

Метод __gt__ используется для определения, больше ли один объект другого. Он вызывается оператором >.

    #... (предыдущий код в person.py)

    def __gt__(self, other: "Person") -> bool:
        """
        Compare two Person objects to see if one is greater than the other based on age.

        :param other: The other Person object to compare with.
        :return: True if the current object's age is greater than the other object's age, False otherwise.
        """
        if isinstance(other, Person):
            return self.age > other.age
        return NotImplemented

__ge__

Метод __ge__ используется для определения, больше или равен ли один объект другому. Он вызывается оператором >=.

    #... (предыдущий код в person.py)

    def __ge__(self, other: "Person") -> bool:
        """
        Compare two Person objects to see if one is greater than or equal to the other based on age.

        :param other: The other Person object to compare with.
        :return: True if the current object's age is greater than or equal to the other object's age, False otherwise.
        """
        if isinstance(other, Person):
            return self.age >= other.age
        return NotImplemented

Пример: Использование магических методов сравнения объектов

Теперь, когда мы определили магические методы сравнения объектов для нашего класса Person, посмотрим, как они работают в compare_example.py:

from person import Person

## Create two Person objects
p1 = Person("Alice", 30)
p2 = Person("Bob", 35)

## Use the __eq__ and __ne__ methods
print(p1 == p2)  ## Output: False
print(p1!= p2)  ## Output: True

## Use the __lt__, __le__, __gt__, and __ge__ methods
print(p1 < p2)  ## Output: True
print(p1 <= p2)  ## Output: True
print(p1 > p2)  ## Output: False
print(p1 >= p2)  ## Output: False

Затем введите следующую команду в терминале для выполнения скрипта.

python compare_example.py

Уничтожение объектов

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

__del__

Метод __del__ вызывается, когда объект собирается быть уничтожен. Он позволяет выполнять очистительные задачи, такие как закрытие файловых дескрипторов или освобождение ресурсов, перед тем, как объект будет утилизирован сборщиком мусора.

    #... (предыдущий код в person.py)

    def __del__(self):
        """
        Clean up the Person object before it is destroyed.
        """
        print(f"Person '{self.name}' is being deleted.")

Пример: Использование магического метода уничтожения объектов

Теперь, когда мы определили магический метод уничтожения объектов для нашего класса Person, посмотрим, как он работает в del_example.py:

from person import Person

## Create a Person object and then delete it
p = Person("Alice", 30)
del p  ## Output: Person 'Alice' is being deleted.

Затем введите следующую команду в терминале для выполнения скрипта.

python del_example.py

Важно отметить, что метод __del__ не гарантируется вызываться немедленно, когда объект больше не нужен. Фактическое удаление объекта зависит от механизма сборки мусора Python. Метод __del__ вызывается, когда сборщик мусора решает удалить объект из памяти.

Обзор

В этом ряде уроков мы изучили магические методы в Python, также известные как "dunder" методы (методы с двумя нижними подчеркиваниями), которые позволяют определить пользовательское поведение для своих объектов в различных ситуациях.

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