Создайте объект python, к которому можно получить доступ с помощью квадратных скобок

#python

#python

Вопрос:

Я хотел бы создать новый класс, который действует как специальный тип контейнера для объектов, и к нему можно получить доступ с помощью квадратных скобок.

Например, предположим, у меня есть вызываемый класс ListWrapper . Предположим obj , что это ListWrapper . Когда я говорю obj[0] , я ожидаю, что метод obj.access() будет вызван с 0 в качестве аргумента. Затем я могу вернуть все, что захочу. Возможно ли это?

Ответ №1:

Вы хотите определить специальный метод __getitem__ [docs] .

 class Test(object):     
    def __getitem__(self, arg):
        return str(arg)*3

test = Test()

print test[0]
print test['kitten']
  

Результат:

000
kittenkittenkitten

Комментарии:

1. Отличный ответ: на месте, включает ссылку на документ и простой проработанный пример.

2. Спасибо! Я знал, что есть какой-то метод, который мне нужно было определить, чтобы получить эту функциональность, я просто не был уверен, как называется этот метод.

3. Ummmm … разве «простой проработанный пример» не должен включать return some_expression ?

4. @JohnMachin: Что-то еще в этом роде?

Ответ №2:

Стандартные объекты Python имеют ряд именованных методов __something__ , которые в основном используются для создания объектов, подключаемых к API на языке. Например __getitem__ , и __setitem__ — это методы, которые вызываются для получения или установки значений с [] помощью нотации. Здесь приведен пример того, как создать нечто, похожее на подкласс словаря Python: https://github.com/wavetossed/mcdict

Обратите внимание, что на самом деле он не является подклассом dictionary, а также имеет update метод. Оба они необходимы, если вы хотите, чтобы ваш класс правильно маскировался под словарь Python.