Есть ли способ определить оператор [ ] для экземпляра класса?

#python #object #operators

#python #объект #операторы

Вопрос:

Я хочу определить класс для представления матрицы

 class matrix:
    def __init__(self, mat):
        self.mat = mat
        self.dim = len(mat)

    @classmethod
    def withDim(matrix, dimension):
        mat = [ [0]*dimension for i in range(dimension)]
        return matrix(mat)
 

где mat находится список списков, чтобы представить матрицу

 A = | a b |
    | c d |
 

Я могу написать следующее

 A = matrix( [ [a, b], [c, d] ])
 

Я также начал определять некоторые операторы, такие как

 def __add__(self, other):
    n = self.dim
    result = self.withDim(n)
    for i in range(n):
        for j in range(n):
            result.mat[i][j] = self.mat[i][j]   other.mat[i][j]
    return result
 

Теперь, если я хочу получить доступ к элементу i, j в матрице A , я должен сделать

 A.mat[i][j]
 

Вопрос в том, могу ли я определить оператор [ ] для выполнения

 A[i][j]
 

точно так же, как я определил __add__ ?

Комментарии:

1. __add__ Там этого self.withDim не должно быть matrix.withDim .

2. оператор [] для класса? Вы бы лучше назвали это operator для экземпляра, так как есть также способ сделать matrix[i][j] , где matrix — это сам класс, а не экземпляр matrix class .

3. @warvariuc просто изменил заголовок, спасибо

Ответ №1:

оператор [] вызывает __getitem__ :

 class A:
    def __getitem__(self, index):
        return index 1

a = A()
print(a[1]) # prints 2
 

Вы можете реализовать [][] , вернув прокси-объект, который представляет строку, а также отвечает на __getitem__ . Или вы можете принять кортеж в качестве индекса и использовать A[i,j] синтаксис.