Python |如何重载__getitem__和__setitem__以允许双索引?

时间:2019-04-11 20:59:08

标签: python indexing operator-overloading

所以我不知道如何在类中重载__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 :(得分:0)

第一个__getitem__返回的对象也需要实现__getitem__。发生该错误的原因是,有一次您返回0,它是一个整数,并且如错误所述:'int'对象不可下标。

更精确地回答您的问题。实现方式取决于存储的数据。

最简单的情况:二维数组

如果您将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__函数同样适用