Рубрики
Без рубрики

Дундер методы

Давайте начнем с введения в другие методы, фундамент для всего Python. … Теги с Python.

Дорога (Python) до Async (2 серии деталей)

Давайте начнем с введения в другие методы, фундамент для всего Python.

Волшебный питон

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

# make a list
lst = [0, 1, 2, 3]
# get the length of the list
len(lst)

# 4

Ничего странного от этого, верно? Но на большинстве общих языков вы бы сделали что-то подобное:

// make a list
let lst = [0, 1, 2, 3]
// get the length of the list
lst.length

// 4

Большая разница в том, что на других языках длина – это атрибут списка, который соответствует концептуально. Но Python делает ЛЕН (LST) отдельная функция. Почему?

Ответ на этот вопрос – ключ к продвинутому программированию Python: в Python разработчик имеет возможность создавать классы, которые могут рассматриваться как встроенные предметы как списки. Это может быть сделано путем реализации методов, которые должны быть вызваны Python не Python Код Отказ

Чтобы продемонстрировать это, давайте напишем класс, который будет поддерживать Лен () функция.

Стек

Давайте посмотрим на скромное Список :

lst = []
lst.append(0)
lst.append(1)
lst.append(2)

print(lst.pop())
# 2

print(lst.pop())
# 1

print(lst.pop())
# 0

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

lst = [0, 1, 2, 3]
print(lst[2])

# 2

Итак, скажем, что мне нужно иметь возможность добавлять значения списка ( Добавить ) и вернуть самое последнее добавленное значение ( POP ). Но я также обеспокоен тем, что никто случайно не извлекает какую-либо другую ценность из списка. В этом случае мы можем написать класс, который позволит только для толкания значения на конец списка, а выключить их. В информатике это известно как стек Отказ

class Stack:
    def __init__(self):
        self._stack = []

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

    def pop(self):
        return self._stack.pop()

Теперь мы можем использовать стек:

stack = Stack()
stack.append(0)
stack.append(1)
stack.append(2)

stack.pop()
# 2
stack.pop()
# 1
stack.pop()
# 0

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

Но есть ловушка: что если в какой-то момент нам нужно проверить, сколько предметов в стеке? Мы могли бы взять наивный подход, и добавить метод длины:

class Stack:
    def __init__(self):
        self._stack = []

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

    def pop(self):
        return self._stack.pop()

    def length(self):
        return len(self._stack)

Но тогда мы теряем преимущество, которое у нас было раньше: что мы можем использовать Стек и Список так же.

Подход Pythonic будет следующим:

class Stack:
    def __init__(self):
        self._stack = []

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

    def pop(self):
        return self._stack.pop()

    # The following method is a `dunder` or `magic` method
    def __len__(self):
        return len(self._stack)

Теперь мы можем сделать это:

stack = Stack()
stack.append(0)
stack.append(1)
stack.append(2)

print(len(stack))
# 3

Как правильный список.

Что здесь происходит?

Когда Лен () называется, что это делает более или менее следующее:

def len(obj):
    return obj.__len__()

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

Используя функцию ( len ), чтобы вызвать метод ( __len__ ), вместо того, чтобы просто звонить сам метод, разработчик будет иметь тенденцию использовать те же имена методов как все остальные Отказ В случае длины каждый класс, который позволяет проверять его размер, будет использовать __leen__ потому что все разработчики Python ожидают использовать лен , который работает только с __leen__ Отказ

Следующий

Далее мы поговорим о том, как методы Dunder Power Python’s для Петли, использующие последовательности и итераторы.

Дальнейшее чтение:

Дорога (Python) до Async (2 серии деталей)

Оригинал: “https://dev.to/uminer/dunder-methods-56ff”