1

¿Cómo puedo convertir éstas lineas de código Java a Python? He intentado lo siguiente, pero no me funcionó correctamente

Mi intento en Python

for i in electroList:
    if(electroList[i] isinstance(object, Electrodomestico) == True):
        electros += electroList[i].precioFinal()
    if(electroList[i] isinstance(object, Lavadora) == True):
        lavadoras += electroList[i].precioFinal()
    if(electroList[i] isinstance(object, Television) == True):
        tvs += electroList[i].precioFinal()

en Java:

for(int i=0;i<listaElectrodomesticos.length;i++){

    if(listaElectrodomesticos[i] instanceof Electrodomestico){
        sumaElectrodomesticos+=listaElectrodomesticos[i].precioFinal();
    }
    if(listaElectrodomesticos[i] instanceof Lavadora){
        sumaLavadoras+=listaElectrodomesticos[i].precioFinal();
    }
    if(listaElectrodomesticos[i] instanceof Television){
        sumaTelevisiones+=listaElectrodomesticos[i].precioFinal();
    }
}

He leído en otras páginas, pero no comprendo bien cómo funcionan las instancias en Python.

FJSevilla
  • 55,603
  • 7
  • 35
  • 58
ShunaXD
  • 13
  • 4

1 Answers1

3

El ciclo for in

El for en Python siempre itera sobre un iterador. Para un rango de enteros se debe usar range() y el for in iterará sobre el iterable que genera:

for i in range(len(listaElectrodomesticos)):
    listaElectrodomesticos[i]...

Ejemplo:

lista = ["Hola", "StackOverflowers"]
for i in range(len(lista)):
    print(lista[i])
Hola
StackOverflowers

Pero es mucho más eficiente iterar directamente sobre la lista, con el for, pero en tal caso a la variable asociada al ciclo se asocia una referencia a cada item directamente:

for item in listaElectrodomesticos:
    item...

Ejemplo:

lista = ["Hola", "StackOverflowers"]
for palabra in lista:
    print(palabra)
Hola
StackOverflowers

isinstance()

Primero, el condicional:

if (electroList[i] isinstance(object, Electrodomestico) == True):

es directamente sintaxis inválida, por hacer éstoif (objeto objeto).

En cuanto a como comprobar si un objeto es instancia de otro:

  • isinstance en el caso de Python es una función builtin.

  • El primer argumento es una referencia al objeto del que quieres comprobar si es instancia de algo.

  • El segundo argumento es una referencia al objeto del que quieres ver si el primero es instancia de él (una clase/tipo). También puede ser un iterable de clases/tipos, en cuyo caso se comprobará si el primer argumento es instancia de alguno de ellos (or).

Si haces:

isinstance(object, Electrodomestico)

siempre será False. object es la clase base de la que deriva cualquier objeto en Python, todos, sin excepción. La única clase que no deriva de nada es el propio object. Por lo tanto, dado que compruebas si object es instancia de Electrodomestico, ésto siempre va a ser False. Electrodomestico si es siempre instancia de object, pero como cualquier otro objeto que exista.

Debe ser:

isistance(item, Electrodomestico)

dónde item es el objeto de la lista.

Además, hacer if isistance(item, Electrodomestico) == True: aunque sintácticamente correcto y funcional, no es convencionalmente correcto. True es un singleton, por lo que se debe usar el operador de identidad is no el operador de igualdad si se quiere comprobar si algo es el objeto True. Ahora bien, si solo queremos saber si algo se evalúa como verdadero, como éste caso, no se debe usar siquiera operador, simplemente:

if isinstance(item, Electrodomestico):

Ejemplos:

n = 3.14

if isistance(n, int):
    print("Es un entero")
else:
    print("No es un entero")

No es un entero

n = 3.14

if isistance(n, float):
    print("Es un float")
else:
    print("No es un foat")

Es un float

n = 3.14

if isistance(n, (int, float)):
    print("Es un entero o un float")
else:
    print("No es un entero ni un float")

Es un entero o un float


Código final

for item in electroList:
    if isinstance(item, Electrodomestico):
        electros += item.precioFinal()
    if isinstance(item, Lavadora):
        lavadoras += item.precioFinal()
    elif isinstance(item, Television):
        tvs += item.precioFinal()

Debes por eficiencia usar siempre if - elif si estás ante condiciones mutuamente excluyentes:

En principio si un objeto es una lavadora no sería una televisión, no deberíamos siquiera comprobarlo (a no ser que existan las "televidoras"...XD). He dejado los dos primero con if porque no se si quieres que sean excluyentes, es decir, si un objeto es un electrodomestico si puede ser también una lavadora o una televisión, pero si de ejecutarse el primer if los otros dos no se cumplirían, entonces lo apropiado es:

for item in electroList:
    if isinstance(item, Electrodomestico):
        electros += item.precioFinal()
    elif isinstance(item, Lavadora):
        lavadoras += item.precioFinal()
    elif isinstance(item, Television):
        tvs += item.precioFinal()

Como nota aparte, las convenciones de estilo para código Python marcan que los nombres de variables deben ser siempre en minúsculas usando _ como separador de palabras. Es solo una convención, pero el nombre de tu lista de items debería ser electro_list y no electroList. Las mayúsculas con CamelCase se reservan para nombres de clases exclusivamente y TODO_MAYÚSCULAS para denotar constantes, el resto (nombres de métodos, funciones, variables y módulos), deben usar todo_en _minúsculas.

FJSevilla
  • 55,603
  • 7
  • 35
  • 58