метод python для определения индексации в классе (использование «[]») - PullRequest
0 голосов
/ 21 января 2019

Я понимаю, что __add__ может использоваться для определения использования + для нового класса. Что является эквивалентом для определения использования []?

Я хотел бы создать класс Parent, который содержит словарь codes, и я бы хотел, чтобы Parent[key] вернул Parent.codes[key]

Я понимаю, что, возможно, я мог бы просто использовать Parent.codes[key], но это кажется излишне многословным, если можно использовать методы, чтобы избежать подобных проблем с такими вещами, как + и ==.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

У вас есть несколько вариантов.Если вы считаете, что ваш класс крякает как dict, то ваш лучший выбор Лучше всего просто расширить dict вместо ссылки на один и попытаться перенаправить все методы:

class Parent(dict):
    # probably do something with the constructor, maybe

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

Буквальный ответ на вашвопрос __getitem__, __setitem__ и __delitem__.Вы можете реализовать три варианта использования оператора индексирования с помощью этих методов:

class Parent:
    def __init__(self, *args, **kwargs):
        self.codes = dict(*args, **kwargs)

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

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

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

Методы вызываются для экземпляра Parent точно так же, как Parent перенаправляет их на dict.

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

0 голосов
/ 21 января 2019

То, что вы ищете, это:

def __getitem__(self, key):

edit:

более конкретно, что вы хотите:

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

edit2: удалить какой-то нерелевантный текст__iter__ и __next__ (см. комментарии)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...