Питон |Как перегрузить __getitem__ и __setitem__, чтобы разрешить двойную индексацию? - PullRequest
0 голосов
/ 11 апреля 2019

, поэтому я не могу понять, как перегрузить операторы __getitem__ и __setitem__ для двойной индексации в моем классе. Я пытаюсь перебрать пользовательский атрибут экземпляра, который представляет собой набор из 2 кортежей, например self.coeffs = ((6,2),(5,5),(1,8)), где первый индекс - это 2 кортежа, а второй - это первый или второй элемент в 2-кортеж Для предыдущего объекта self.coeffs[2][0] будет 1.

Я почти уверен, что понимаю, как настроить методы для одного индекса, но я не знаю, как заставить Python рассмотреть второй вызов индекса.

Вот раздел моего класса (self.coeffs - это атрибут экземпляра, созданный из пользовательских кортежей):

Там, где класс впервые вызывает операторы индекса:

`def __str__(self):
       if self.__coeffs[0][1] == 0:   #TypeError: 'int' object isn't subscriptable
            return str((self.__coeffs)[0][0])`

Мои текущие операторы индекса:

`def __getitem__(self, idx):
     for t in self.__coeffs:
         if t[1] == idx:
             return t[0]
     if idx not in [t[1] for t in self.__coeffs]:
         return 0


 def __setitem__(self, idx, value):
     for t in self.__coeffs:
         if t[1] == idx:
             t[0] = value
     if idx not in [t[1] for t in self.__coeffs]:
         self.addterm(value, exp)`

Кроме того, у меня должен быть один параметр idx для __getitem__, я не могу передать больше, чем этот единственный аргумент. Если кто-то знает, как обойти это или есть какие-либо предложения, это будет высоко ценится, спасибо.

1 Ответ

0 голосов
/ 12 апреля 2019

Объект, который возвращается первым __getitem__, должен также реализовать __getitem__.Ошибка возникает из-за того, что в какой-то момент вы возвращаете 0, которое является целым числом, и, как говорится в ошибке: объект int не может быть подписан.

Чтобы ответить на ваш вопрос более точно.Реализация зависит от хранимых данных.

Простейший случай: массив 2d

Если вы храните 2d в своем классе, вы можете вернуть его следующим образом:

# self.data[[0,1],[0,1],[34,234,234,234]]
def __getitem__(self, idx):
   return self.data[idx]  

Вы должны убедиться, что вы всегда возвращаете другой список.

Другие объекты

Если вы хотите вернуть другой объекткласс, этот объект должен реализовать метод __getitem__.

class A:
    # self.data = [1,2,3,67]
    def __getitem__(self, idx):
        return self.data[idx]

class B:
    # self.data = [A(), A(), A()]
    def __getitem__(self, idx):
        return self.data[idx]

То же самое относится к функции __setitem__

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