«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Изучите магические методы Python: простое объяснение

Изучите магические методы Python: простое объяснение

Опубликовано 18 августа 2024 г.
Просматривать:846

Learn Python Magic Methods: A Simple Explanation

Понимание магических методов в Python

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

1. Методы доступа к атрибутам

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

__getattr__ и __getattribute__

  • __getattr__: вызывается, когда атрибут не найден в объекте.

  • __getattribute__: вызывается безоговорочно для доступа к любому атрибуту.

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

class LoggedAttributes:
    def __init__(self, name):
        self.name = name

    def __getattr__(self, item):
        print(f"Accessing non-existent attribute: {item}")
        return None

    def __getattribute__(self, item):
        print(f"Getting attribute: {item}")
        return super().__getattribute__(item)

# Usage
obj = LoggedAttributes("Alice")
print(obj.name)  # Output: Getting attribute: name\nAlice
print(obj.age)   # Output: Accessing non-existent attribute: age\nNone

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

__setattr__ и __delattr__

  • __setattr__: вызывается при попытке присвоения атрибута.

  • __delattr__: вызывается при попытке удаления атрибута.

Пример: изменение пользовательского атрибута с проверкой

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __setattr__(self, key, value):
        if key == "age" and value 



Практический пример использования: Обеспечение соблюдения правил или ограничений проверки при установке или удалении атрибутов.

2. Контейнерные методы

Эти волшебные методы позволяют вашим объектам вести себя как контейнеры (списки, словари и т. д.).

__len__, __getitem__, __setitem__, __delitem__ и __iter__

  • __len__: возвращает длину контейнера.

  • __getitem__: извлекает элемент по заданному индексу или ключу.

  • __setitem__: устанавливает элемент по заданному индексу или ключу.

  • __delitem__: удаляет элемент по заданному индексу или ключу.

  • __iter__: возвращает объект итератора.

Пример: объект, похожий на пользовательский список

class CustomList:
    def __init__(self):
        self._items = []

    def __len__(self):
        return len(self._items)

    def __getitem__(self, index):
        return self._items[index]

    def __setitem__(self, index, value):
        self._items[index] = value

    def __delitem__(self, index):
        del self._items[index]

    def __iter__(self):
        return iter(self._items)

    def append(self, item):
        self._items.append(item)

# Usage
cl = CustomList()
cl.append(1)
cl.append(2)
cl.append(3)
print(len(cl))  # Output: 3
print(cl[1])    # Output: 2
for item in cl:
    print(item)  # Output: 1 2 3

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

3. Численные методы и методы сравнения

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

Числовые методы

  • __add__, __sub__, __mul__, __truediv__, __floordiv__, __mod__, __pow__: определение арифметических операций.

Пример: класс специального комплексного числа

class Complex:
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    def __add__(self, other):
        return Complex(self.real   other.real, self.imag   other.imag)

    def __sub__(self, other):
        return Complex(self.real - other.real, self.imag - other.imag)

    def __repr__(self):
        return f"({self.real}   {self.imag}i)"

# Usage
c1 = Complex(1, 2)
c2 = Complex(3, 4)
print(c1   c2)  # Output: (4   6i)
print(c1 - c2)  # Output: (-2   -2i)

Практический пример использования: Реализация пользовательских числовых типов, таких как комплексные числа, векторы или матрицы.

Методы сравнения

  • __eq__, __ne__, __lt__, __le__, __gt__, __ge__: определение операций сравнения.

Пример: реализация общего порядка для пользовательского класса

from functools import total_ordering

@total_ordering
class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __eq__(self, other):
        return (self.title, self.author) == (other.title, other.author)

    def __lt__(self, other):
        return (self.title, self.author) 



Практический пример использования: Включение сортировки или сравнения пользовательских объектов, что полезно в структурах данных, таких как кучи, двоичные деревья поиска или просто при сортировке списков пользовательских объектов.

4. Контейнерные методы: пример практического использования

Пользовательский словарь с ключами, нечувствительными к регистру

Создание объекта, подобного словарю, который обрабатывает ключи без учета регистра.

Пример: словарь без учета регистра

class CaseInsensitiveDict:
    def __init__(self):
        self._data = {}

    def __getitem__(self, key):
        return self._data[key.lower()]

    def __setitem__(self, key, value):
        self._data[key.lower()] = value

    def __delitem__(self, key):
        del self._data[key.lower()]

    def __contains__(self, key):
        return key.lower() in self._data

    def keys(self):
        return self._data.keys()

    def items(self):
        return self._data.items()

    def values(self):
        return self._data.values()

# Usage
cid = CaseInsensitiveDict()
cid["Name"] = "Alice"
print(cid["name"])  # Output: Alice
print("NAME" in cid)  # Output: True

Практический пример использования: Создание словарей, в которых ключи должны обрабатываться без учета регистра, что полезно для обработки вводимых пользователем данных, настроек конфигурации и т. д.

Заключение

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/tapstechie/learn-python-magic-methods-a-simple-explanation-21ap?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3