使用多个参数重载括号运算符

时间:2017-11-09 16:18:30

标签: python-2.7

为了简化起见,我在numpy数组周围构建了一个包装器,我将只显示显示错误的必要部分:

class Matrix(object):
    """wrap around numpy array
    """

    def __init__(self, shape, fill_value):
        self.matrix = np.full(shape, fill_value)

    def __getitem__(self, a, b):
        return self.matrix[a, b]



m = Matrix((10, 10), 5)
print(m[5, 5])

print语句生成以下错误:

KeyError: __getitem__() takes exactly 3 arguments (2 given)

使用[]运算符访问m的修复方法如下:

m[1, 1]

2 个答案:

答案 0 :(得分:1)

目前,您有一个类Matrix,其属性matrix是一个numpy数组。因此,您需要先引用该属性,然后传递索引:

>>> m.matrix[5,5]
5

此时,你有缠绕numpy数组。根据您的想法,这可能是朝着正确方向迈出的一步:

class Matrix(np.ndarray):
    def __new__(cls, shape, fill_value=0):
        return np.full(shape, fill_value)

>>> m = MyMatrix((10, 10), 5)
>>> print(m[5, 5])
>>> 5

然而,这基本上只是m = np.full(shape, fill_value)。我想你想要将自定义属性和方法添加到numpy数组中,你应该在numpy文档中查看this example

答案 1 :(得分:0)

解决方案是将变量传递给变量,如下所示:

class Matrix(object):
    """wrap around numpy array
    """

    def __init__(self, shape, fill_value):
        self.matrix = np.full(shape, fill_value)

    def __getitem__(self, a):
        # we could do also do return self.matrix[a[0], a[1]]
        return self.matrix[a] 


    m = Matrix((10, 10), 5)
    print(m[5, 5])