Python - Mejorar en la POO

 
Vista:
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por Anikollaste (118 intervenciones) el 01/05/2020 19:00:56
Hola a todos.

Hace poco que he empezado a programar y me gustaría mejorar en la POO.
Quisiera saber si voy bien y que puedo mejorar (que será mucho).
A continuación dejo un programa en el que tengo varias dudas, mi intención es poder reutilizar y optimizar el código.
Solo así he conseguido que el programa funcione, pero yo quisiera pedir los datos al usuario y pasárselos por argumentos a los métodos.

Gracias y un saludo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Tributar():
	#def __init__(self):
 
		# self.mayor_edad
		# self.ingresos
		# self.tributando
 
	def mayor_edad(self, edad):
		#edad = int(input("Introduzca su edad: ")) #La entrada de datos no consigo hacerla funcionar.
 
		if edad >= 16:
			return True
		else:
			return False
 
	def ingresos(self, ingresos):
		#ingresos = int(input("Introduzca su salario: ")) #La entrada de datos no consigo hacerla funcionar.
 
		if ingresos >= 1000:
			return True
		else:
			return False
 
	def tributando(self, mayor, sueldo):
 
		if (self.mayor_edad) and (self.ingresos):
			return "Usted debe tributar"
		else:
			return "Usted no debe tributar"
 
miTributo = Tributar()
print(miTributo.tributando(miTributo.mayor_edad(16), miTributo.ingresos(1000)))
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
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por tincopasan (1082 intervenciones) el 01/05/2020 20:58:16
hola:
esto se puede hacer de muchas formas(tu código), lo de mejorar lleva un poco de tiempo, lectura y práctica, tratá de cumplir los 3 siendo paciente.
en cuanto al código te muestro dos formas posibles de ingresar los datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#-*- coding: utf -8 -*-
class Tributar():
	#def __init__(self):
		#self.mayor_edad = ""
		#self.ingresos = ""
		# self.tributando
 
	def mayor_edad(self):
		edad = int(input("Introduzca su edad: ")) #La entrada esta dentro de la función, en este caso no lo paso como parámetro.
		if edad >= 16:
			self.mayor_edad = True
		else:
			self.mayor_edad = False
		return self.mayor_edad
 
	def ingresos(self,ingresos):
		#ingresos = int(input("Introduzca su salario: ")) #La entrada no está en la función, la paso como parámetro.
		if ingresos >= 1000:
		    self.ingresos = True
		else:
		    self.ingresos = False
		return self.ingresos
 
 
	def tributando(self, mayor, sueldo):
		if (self.mayor_edad) and (self.ingresos):
			return "Usted debe tributar"
		else:
			return "Usted no debe tributar"
 
miTributo = Tributar()
mayor = miTributo.mayor_edad()  #los datos en la función
ingresos = int(input("Introduzca su salario: ")) #datos para pasar a la función
print(miTributo.tributando(mayor,miTributo.ingresos(ingresos)))

Espero se entienda.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por Anikollaste (118 intervenciones) el 01/05/2020 23:09:45
Hola tincopasan.
Estoy mirando el código por encima,(mañana lo haré con mas detenimiento) y a vote pronto veo que tendré que descomentar el constructor.
Entiendo las dos formas para la entrada de datos.

Gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por tincopasan (1082 intervenciones) el 02/05/2020 00:06:02
bueno,si ya usas el método init, podría ser así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Tributar():
	def __init__(self,edad,ingresos):
		self.edad = edad
		self.ingresos = ingresos
		self.mayor(self.edad)
		self.sueldo(self.ingresos)
 
	def mayor(self,edad):
		if self.edad >= 16:
			self.mayor_edad = True
		else:
			self.mayor_edad = False
 
	def sueldo(self,ingresos):
		if self.ingresos >= 1000:
			self.ingresos = True
		else:
			self.ingresos = False
 
	def tributando(self):
		if (self.mayor_edad) and (self.ingresos):
			return "Usted debe tributar"
		else:
			return "Usted no debe tributar"
 
edad = int(input("Introduzca su edad: "))
ingresos = int(input("Introduzca su salario: "))
miTributo = Tributar(edad,ingresos)
print(miTributo.tributando())
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por Anikollaste (118 intervenciones) el 02/05/2020 12:00:50
Hola, he estado revisando el código y cacharreando.
El método __init__ recién empiezo a usarlo, pero quiero mejorar de ahí que lo mencione.

A fin de presentar mis dudas de una mejor manera, he ido comentando el código línea por línea. Alguna duda ha salido, pero en general he entendido mejor la forma de estructurár las clases.

Espero que con un poco mas de práctica, pueda aportar algo al foro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Tributar():
 
	def __init__(self,edad,ingresos):
 
		self.edad = edad   # Variable que almacena edad pasada como argumento del método __init__
		self.ingresos = ingresos   # Idem
		self.mayor(self.edad)   # No acabo de entenderlo
		self.sueldo(self.ingresos)   # Idem
 
	def mayor(self,edad):   # El parámetro lo recibe de: 'self.mayor(self.edad)' donde '(self.edad)' obtiene el parámetro
		if self.edad >= 16:   # de la variable 'edad = entrada de datos' ????
			self.mayor_edad = True    # Almacena el resultado de evaluar la condición 'if self.edad >= 16'
 
#La variable 'self.mayor_edad' podría ser 'self.edad' ????? (Lo he comprobado y funciona) pero no sé
# si es correcto hacerlo.
		else:
			self.mayor_edad = False
 
	def sueldo(self,ingresos):   # El parámetro lo recibe de: 'self.sueldo(self.ingresos)'' donde '(self.ingresos)' obtiene el parámetro
		if self.ingresos >= 1000:    # de la variable 'ingresos = entrada de datos' ???
			self.ingresos = True
 
		else:
			self.ingresos = False
 
	def tributando(self):
 
		if (self.mayor_edad) and (self.ingresos):
			return "Usted debe tributar"
 
		else:
			return "Usted no debe tributar"
 
edad = int(input("Introduzca su edad: "))
ingresos = int(input("Introduzca su salario: "))#Todo este punto lo entiendo mucho mejor ahora!!
miTributo = Tributar(edad,ingresos
print(miTributo.tributando())
Espero que se entienda bien.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por tincopasan (1082 intervenciones) el 02/05/2020 16:43:13
Hola:
Guarda que ésta no es la única forma,ni la mejor, cada uno elige la propia, lo estoy haciendo en base a tu código y tratando de modificar lo menos posible,pero si entiendes los conceptos después usarás estructuras propias.
Tratando de aclarar:
1
2
3
4
self.mayor(self.edad)   # es una funcione que deben ejecutarse antes de llamar a tributando
           	#para obtener mayor_edad
		#puede ir en tributando inclusive u otra función , pero hay que invocarlas
self.sueldo(self.ingresos)   # Idem

1
2
3
4
if self.edad >= 16:   # de la variable 'edad = entrada de datos' ????
       #en este caso si, pero se puede declarar directamente al instanciar la clase
       #ejemplo
miTributo = Tributar(16,ingresos)   #pero en este caso es solo por código

1
2
La variable 'self.mayor_edad' podría ser 'self.edad' ????? (Lo he comprobado y funciona) pero no sé
 si es correcto hacerlo.

Digo por lo general que si funciona es correcto, claridad de código es otro tema
buscá sobre self , en mi caso tiene que ver con el alcance de la variable y no escribir innecesariamente, pero me olvido que a veces no queda claro.
1
2
3
def sueldo(self,ingresos):   # El parámetro lo recibe de: 'self.sueldo(self.ingresos)'' donde '(self.ingresos)' obtiene el parámetro
    if self.ingresos >= 1000:    # de la variable 'ingresos = entrada de datos' ???
	     #si igual que antes  
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por Anikollaste (118 intervenciones) el 02/05/2020 17:18:13
Gracias por las aclaraciones, poco a poco voy cogiendo el hilo sobre las clases.

Por lo que he leído sobre self;

Entiendo que hace referencia al los futuros objetos de la clase, donde 'self' será sustituido por (y siguiendo el ejemplo de la clase Tributar) 'miTributo' y que por convención se define como self, pero que podría ser cualquier otra palabra.

Espero haberme expresado con claridad y estar en lo cierto.

Me está siendo de gran ayuda tu apoyo, hasta ahora iba un poco perdido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por tincopasan (1082 intervenciones) el 02/05/2020 17:55:06
ah ya veo lo que leíste de self, más allá del uso por convención
te muestro un ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-*- coding: utf -8 -*-
class Saludar:
 
    def __init__(self, nombre):
        self.nombre = nombre
        otro = nombre
        self.aja =nombre
 
    def hola(self):
        denuevo = self.nombre
        print("hola ",self.nombre)# self también extiende el alcance de las variables
        print("hola", otro)  #esto es un error porque otro solo llega a __int__,    no funciona
        print("hola de nuevo ", denuevo) # acà denuevo está en está función con el valor que traje
        print("hola ",self.aja)# self también extiende el alcance de las variables
 
s = Saludar("tincopasan")
s.hola()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por Anikollaste (118 intervenciones) el 02/05/2020 18:41:45
Ok, esto es nuevo y muy interesante, ahora veo el porqué del self, buscaré mas info.

Ejercicio:
Escribir un programa que lea la puntuación del usuario e indique su nivel de rendimiento, así como la cantidad de dinero
que recibirá el usuario.
(Fuente: aprendeconalf.es) No sé si está permitido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Puntuacion():
 
	def __init__(self, puntos):
 
		self.puntos = puntos
		self.dinero = 2400
 
	def puntuar (self):
 
		if self.puntos == 0.0:
			return "Inaceptable"
 
		elif self.puntos == 0.4:
			return "Aceptable"
 
		elif self.puntos >= 0.6:
			return "Meritorio"
 
	def cantidad (self):
 
		retribu = self.puntos * self.dinero
		return retribu
 
puntos = float(input("Introduzca su puntuación: "))
miPuntuacion = Puntuacion(puntos)
print(f"Su nivel es: {miPuntuacion.puntuar()}, y la cantidad a percibir es: {miPuntuacion.cantidad()}$")
Parece que en cada ejercicio que hago me salvo por los pelos, pero no creo que estén ni optimizados ni bien estructurados.

Qué me recomendarías, seguir leyendo, hacer ejercicios?
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por tincopasan (1082 intervenciones) el 02/05/2020 19:29:24
veamos:
como te dije, cada programador tiene su propia lógica y no creo que sea bueno decir cual es mejor o peor, cada uno implementa como puede(salvo que trabajes en grupo)
No te voy a dar mi punto de vista en cada ejercicio de ahora en más, salvo que cometas errores y no funcionen.
Para aprender o mejorar , hay que leer, entender y practicar, por supuesto que también se puede y muchas veces se debe preguntar
por como has resuelto el ejercicio, escribís mucho y si, hay cosas que no necesitan ser así.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Puntuacion:
	def __init__(self, puntos):
		self.puntos = puntos
	def principal(self):
		if self.puntos == 0.0:
			self.nivel = "Inaceptable"
		elif self.puntos == 0.4:
			self.nivel = "Aceptable"
		elif self.puntos >= 0.6:
			self.nivel = "Meritorio"
		self.retribu = self.puntos * 2400
		return self.nivel, self.retribu
 
puntos = float(input("Introduzca su puntuación: "))
miPuntuacion = Puntuacion(puntos)
nivel,re = miPuntuacion.principal()
print(f"Su nivel es: {nivel}, y la cantidad a percibir es:{re}  $")
acostumbrate a usar variables
Saludos.
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
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Mejorar en la POO

Publicado por Anikollaste (118 intervenciones) el 02/05/2020 19:54:07
Vaya! se ve mucho más claro.
Voy a seguir tu consejo e informarme en mas profundidad sobre la POO.
Gracias y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar