@Derfirm
Noname Developer.

В чём принципиальная разница, использовать магический метод __getitem__ или получать элемент по индексу?

Доброго времени суток.
Во време блужданию по гитхабу, наткнулся на неявную для себя вещь.
У какого-то класса один из атрибутов является список, нас интерисует к примеру его второй элемент.
ex_list =<some values>
if ex_list.__len__() > 1:
    ex_list.__getitem__(1)
    # я часто пишу просто так
    # ex_list[1]

Суть вопроса, в чём принципиальная разница между использоваеним __getitem__ и [1] ?
  • Вопрос задан
  • 326 просмотров
Пригласить эксперта
Ответы на вопрос 2
MrLinch
@MrLinch
Just like coding...
Разница все же есть. Не в результате, а методе которым это результат получаем. (использование [] эффективней)

Припустим есть у нас такой код

items = [1, 2, 3, 4]

def get_item_as_method():
    return items.__getitem__(1)

def get_item_as_operator():
    return items[1]


Если мы дизассемблируем (модуль dis) эти функций увидим следующие:

Для get_item_as_method:
LOAD_GLOBAL            0 (items)
LOAD_ATTR                1 (__getitem__)
LOAD_CONST             1 (1)
CALL_FUNCTION        1 (1 positional, 0 keyword pair)
RETURN_VALUE


Для get_item_as_operator:
LOAD_GLOBAL              0 (items)
LOAD_CONST               1 (1)
BINARY_SUBSCR
RETURN_VALUE


Видим в первом случае для получения результата нужно выполнить две операций (LOAD_ATTR и CALL_FUNCTION), а в первом всего одну BINARY_SUBSCR.
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
Разницы, насколько я понимаю, никакой нет. __getitem__ служит для реализации собственных методов доступа и если он определен - можно писать obj[i].
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы