Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: El mas antiguo en 28 Septiembre 2022, 15:51 pm



Título: Método duplicado en herencia con python.-
Publicado por: El mas antiguo en 28 Septiembre 2022, 15:51 pm
Hola gente ¿como estan?.
Una simple pregunta ¿puedo  hacer que de los 2 metodos
hacer lo mismo con solo uno?.-
Bueno es todo, espero que no lo borren porque me esta
costando con la POO y estas que debe ser una cosa simple
para Uds. para mi es mucho, gracias...

Código
  1. class Automovil():
  2.    def __init__(self, ruedas, puertas):
  3.        self.ruedas = ruedas
  4.        self.puertas = puertas
  5.  
  6.    def mostrar(self):
  7.        print(f"ruedas...: {a.ruedas}\npuertas..: {a.puertas}")    
  8.  
  9.  
  10. class Audi(Automovil):
  11.    def __init__(self, ruedas, puertas, color, modelo):
  12.        super().__init__(ruedas, puertas)
  13.        self.color = color
  14.        self.modelo = modelo
  15.  
  16.    def mostrar(self):
  17.        print(f"\nruedas...: {b.ruedas}\npuertas..: {b.puertas}\ncolor....: {b.color}\nmodelo...: {b.modelo}")
  18.  
  19.  
  20. a = Automovil(ruedas=4, puertas=5)
  21. a.mostrar()
  22. b = Audi(ruedas=4, puertas=4, color='azul', modelo=2020)
  23. b.mostrar()


Slds. Daniel ☕☕☕


Título: Re: Método duplicado en herencia con python.-
Publicado por: MCKSys Argentina en 28 Septiembre 2022, 16:46 pm
Hola!

No entiendo tu pregunta. Podrías reformularla?

Saludos!


Título: Re: Método duplicado en herencia con python.-
Publicado por: El mas antiguo en 28 Septiembre 2022, 16:52 pm
Hola, gracias por ocuparte
Hacer de estos 2 métodos uno solo...

Código
  1.    def mostrar(self):
  2.        print(f"ruedas...: {a.ruedas}\npuertas..: {a.puertas}")  
  3.  
  4.  
  5.    def mostrar(self):
  6.        print(f"\nruedas...: {b.ruedas}\npuertas..: {b.puertas}\ncolor....: {b.color}\nmodelo...: {b.modelo}")


Slds. Daniel ☕☕☕


Título: Re: Método duplicado en herencia con python.-
Publicado por: MCKSys Argentina en 28 Septiembre 2022, 17:18 pm
No soy experto en python (aunque "programo" todos los días en el lenguaje), pero puedes hacer lo siguiente:

Código
  1. class Automovil():
  2.    def __init__(self, ruedas, puertas):
  3.        self.ruedas = ruedas
  4.        self.puertas = puertas
  5.  
  6.    def mostrar(self):
  7.        print(f"ruedas...: {a.ruedas}\npuertas..: {a.puertas}")
  8.  
  9.  
  10. class Audi(Automovil):
  11.    def __init__(self, ruedas, puertas, color, modelo):
  12.        # Prefiero este tipo de llamado a 'super' por ser compatible con python 2.7
  13.        super(Audi, self).__init__(ruedas=ruedas, puertas=puertas)
  14.        # super().__init__(ruedas, puertas)
  15.        self.color = color
  16.        self.modelo = modelo
  17.  
  18.    def mostrar(self):
  19.        # print(f"\nruedas...: {b.ruedas}\npuertas..: {b.puertas}\ncolor....: {b.color}\nmodelo...: {b.modelo}")
  20.        print(f"\n") # Esto es para agregar una linea
  21.        super(Audi, self).mostrar() # Llama a mostrar de la clase padre para que imprima ruedas y puertas
  22.        print(f"color....: {b.color}\nmodelo...: {b.modelo}") # Imprime los atributos agregados en Audi (color y modelo)
  23.  
  24.  
  25. a = Automovil(ruedas=4, puertas=5)
  26. a.mostrar()
  27. b = Audi(ruedas=4, puertas=4, color='azul', modelo=2020)
  28. b.mostrar()
  29.  

Eso es si quieres agregar atributos en la clase Audi.

En tu caso, agregaría los atributos de color y modelo a la clase Automovil y agregaría otro atributo llamado 'marca' que tendría uno de los valores en las marcas soportadas (puedes crear constantes con los valores de cada marca y asignarlo en dicho atributo).

Saludos!


Título: Re: Método duplicado en herencia con python.-
Publicado por: reymosquito en 28 Septiembre 2022, 19:50 pm
hay varias formas de hacer  esto, pero me parece oportuno aclararte  algunos conceptos que si bien no están mal, es mejor hacerlos de otra forma.
Código
  1. class Automovil():
  2.    def __init__(self, ruedas, puertas):
  3.        self.ruedas = ruedas
  4.        self.puertas = puertas
  5.  
  6.    def mostrar(self):
  7.        return(f"""ruedas...: {self.ruedas}
  8. puertas..: {self.puertas}""")

1) es una buena práctica usar return en las funciones sino después está la típica pregunta de ¿por qué sale un None ? las funciones deben, aunque no es obligatorio retornar algo
2)cambié la forma de mostrar la cadena, solo porque me parece mucho más claro la lectura
3)self no es una palabra reservada, pero por convención es la más usada, sobre todo porque en códigos extensos y también para otros programadores es más simple la comprensión del código, lo mismo para uno en el paso del tiempo.
4)Si bien este ejemplo es una forma de compartir métodos para mostrar los atributos se usa mucho más el método __str__() en lugar de difinir uno propio.



Código
  1. class Audi(Automovil):
  2.    def __init__(self, ruedas, puertas, color, modelo):
  3.        Automovil.__init__(self,ruedas, puertas)
  4.        self.color = color
  5.        self.modelo = modelo
  6.  
  7.    def mostrar(self):
  8.        return(f"""{Automovil.mostrar(self)}
  9. color....: {self.color}
  10. modelo...: {self.modelo}""")

como dije, se puede, ya que no es obligatorio hacer de otras formas, aunque en este caso no es necesario usar super, ya que directamente invoco al método __init__ de la clase padre.

Código
  1. a = Automovil(4,5)
  2. print(a.mostrar())
  3. b = Audi(4,4, 'azul',2020)
  4. print(b.mostrar())

como me gusta escribir poco simplemente declaro los atributos.

Con respecto a lo de duplicados no lo son, ya que cada clase tiene sus propios atributos.


Título: Re: Método duplicado en herencia con python.-
Publicado por: El mas antiguo en 29 Septiembre 2022, 14:17 pm
Muchas veces dije que se aprende mas en un buen
foro que con un manual, gracias rey...

Slds. Daniel ☕☕☕