Python - __getitem__

 
Vista:
sin imagen de perfil

__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
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

__getitem__

Publicado por kip (257 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
2
Comentar
Imágen de perfil de Paolo
Val: 13
Ha disminuido su posición en 9 puestos en Python (en relación al último mes)
Gráfica de Python

__getitem__

Publicado por Paolo (5 intervenciones) el 01/06/2019 19:57:41
Pues este código funciona:
1
2
3
4
5
6
7
8
9
10
class matriz(object):
 
    def __init__(self, matriz):
        self.matriz= matriz
 
    def __getitem__(self, item):
        return self.matriz[item]
 
A= matriz([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(A[1][2]) #6
Lo que sucede es que cuando se llama al método __getitem__ este devuelve lo que hay dentro de self.matriz[item] que en este caso es una lista, y el objeto lista tiene su propio __getitem__.

Primero se ejecuta el [1] y luego el [2]:
1
A[1][2] #A.__getitem__(1).__getitem__(2)
He de decir que he probado el código en Python 3.7.3, soy lo suficientemente nuevo en programación para solo haber usado esa versión de Python xD, pero dudo demasiado que este pedazo de código no funcione en Python 2.

Psdt: Sé que no es necesario heredar de object en Python 3, lo hice para entrar en contexto.
Psdt 2: Sé que esta pregunta va a cumplir sus 2 años, pero para los que vienen con la misma duda, aquí está la respuesta.

Un gustavo.
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