Python - __getitem__

   
Vista:

__getitem__

Publicado por Guillermo (12 intervenciones) el 06/06/2017 17:58:01
Según tengo entendido, hablando sobre python 2.7, el método mágico __getitem__ se utiliza para añadir a una clase la opción de poder ser indexado al llamarlo a un objeto directamente. Pongo el siguiente ejemplo:

1
2
3
4
5
6
7
8
9
10
class vector(object):
 
    def __init__(self, vector):
        self.vector=vector
 
    def __getitem__(self,n):
        return self.vector[n]
 
u=vector([1,2,3])
print (u[1])

Este código me permite imprimir en consola el valor u[1], que es 2.

Mi duda es, ¿se puede utilizar este método de alguna forma para que se usen dos coeficientes en una matriz bidimensional?. Es decir, yo tengo el objeto matriz y quiero acceder de forma directa a uno de sus componentes:

1
2
3
4
5
6
7
8
9
10
class matriz(object):
 
    def __init__(self,matriz):
        self.matriz=matriz
 
    def __getitem__(self, i, j):
        return self.matriz[i][j]
 
A=matriz([[1,1,1],[1,1,1],[1,1,1]])
print (A[1][2])

Este código da error, ¿como podría hacerlo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip

__getitem__

Publicado por kip (242 intervenciones) el 08/06/2017 01:58:22
Hola, te da error porque __getitem__ solo funciona aceptando un parametro nada mas, lo que sucede cuando haces eso A[1][2] es que haces una doble llamada a __getitem__ en cada llamada enviando los indices [1] y [2] respectivamente, lo que se me ocurre en tu caso es enviar una tupla de numeros y a partir de alli obtener el elemento de la lista dentro de la otra lista, algo asi:

1
2
3
4
5
6
7
8
9
10
11
class matriz(object):
 
    def __init__(self,matriz):
        self.matriz=matriz
 
    def __getitem__(self, nums):
        i, j = nums
        return self.matriz[i][j]
 
A=matriz([[1, 3, 5],[2, 4, 6],[7, 9, 11]])
print (A[1, 2])

Obtendremos
1
6

__getitem__ siempre espera un argumento como metodo magico, pero si lo usas como un metodo mas serviria en tu caso:

1
2
3
4
5
6
7
8
9
10
class matriz(object):
 
    def __init__(self,matriz):
        self.matriz=matriz
 
    def __getitem__(self, i, j):
        return self.matriz[i][j]
 
A=matriz([[1, 3, 5],[2, 4, 6],[7, 9, 11]])
print (A.__getitem__(1,2))

1
6
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Revisar política de publicidad