Введение
В этом уроке мы изучим базовые магические методы в Python. Магические методы, также известные как "dunder" методы (методы с двумя нижними подчеркиваниями), позволяют определить, как объекты Python ведут себя в определенных ситуациях, что позволяет выполнять продвинутую и настраиваемую манипуляцию с объектами.
Инициализация и представление объектов
В этом разделе мы изучим магические методы инициализации и представления объектов в 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. Понимание и реализация этих методов позволит вам писать более эффективный, чистый и питонический код, делая ваши программы более надежными и поддерживаемыми.



