#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.