45 - Llamada de métodos desde otro método de la misma clase

Hasta ahora todos los problemas planteados hemos llamado a los métodos desde donde definimos un objeto de dicha clase, por ejemplo:

empleado1=Empleado("diego",2000)
empleado1.paga_impuestos()

Utilizamos la sintaxis:

[nombre del objeto].[nombre del método]

Es decir antecedemos al nombre del método el nombre del objeto y el operador punto

Ahora bien que pasa si queremos llamar dentro de la clase a otro método que pertenece a la misma clase, la sintaxis es la siguiente:

self.[nombre del método]

Es importante tener en cuenta que esto solo se puede hacer cuando estamos dentro de la misma clase.

Problema 1:

Plantear una clase Operaciones que solicite en el método __init__ la carga de dos enteros e inmediatamente muestre su suma, resta, multiplicación y división. Hacer cada operación en otro método de la clase Operación y llamarlos desde el mismo método __init__

Programa: ejercicio194.py

Ver video

class Operacion:

    def __init__(self):
        self.valor1=int(input("Ingrese primer valor:"))
        self.valor2=int(input("Ingrese segundo valor:"))
        self.sumar()
        self.restar()
        self.multiplicar()
        self.dividir()

    def sumar(self):
        suma=self.valor1+self.valor2
        print("La suma es",suma)

    def restar(self):
        resta=self.valor1-self.valor2
        print("La rersta es",resta)

    def multiplicar(self):
        multi=self.valor1*self.valor2
        print("El producto es",multi)

    def dividir(self):
        divi=self.valor1/self.valor2
        print("La division es",divi)


# bloque principal

operacion1=Operacion()

Nuestro método __init__ además de cargar los dos enteros procede a llamar a los métodos que calculan la suma, resta, multiplicación y división de los dos valores ingresados.
La llamada de los métodos de la misma clase se hace antecediendo al nombre del método la palabra self:

    def __init__(self):
        self.valor1=int(input("Ingrese primer valor:"))
        self.valor2=int(input("Ingrese segundo valor:"))
        self.sumar()
        self.restar()
        self.multiplicar()
        self.dividir()

El método que calcula la suma de los dos atributos cargados en el método __init__ define una variable local llamada suma y guarda la suma de los dos atributos. Posteriormente muestra la suma por pantalla:

    def sumar(self):
        suma=self.valor1+self.valor2
        print("La suma es",suma)

De forma similar los otros métodos calculan la resta, multiplicación y división de los dos valores ingresados:

    def sumar(self):
        suma=self.valor1+self.valor2
        print("La suma es",suma)

    def restar(self):
        resta=self.valor1-self.valor2
        print("La rersta es",resta)

    def multiplicar(self):
        multi=self.valor1*self.valor2
        print("El producto es",multi)

    def dividir(self):
        divi=self.valor1/self.valor2
        print("La division es",divi)

En el bloque principal de nuestro programa solo requerimos crear un objeto de la clase Operación ya que el resto de los métodos se llama en el método __init__:

# bloque principal

operacion1=Operacion()

Problema 2:

Plantear una clase que administre dos listas de 5 nombres de alumnos y sus notas. Mostrar un menú de opciones que permita:
1- Cargar alumnos.
2- Listar alumnos.
3- Mostrar alumnos con notas mayores o iguales a 7.
4- Finalizar programa.

Programa: ejercicio195.py

Ver video

class Alumnos:

    def __init__(self):
        self.nombres=[]
        self.notas=[]

    def menu(self):
        opcion=0
        while opcion!=4:
            print("1- Cargar alumnos")
            print("2- Listar alumnos")
            print("3- Listado de alumnos con notas mayores o iguales a 7")
            print("4- Finalizar programa")
            opcion=int(input("Ingrese su opcion:"))
            if opcion==1:
                self.cargar()
            elif opcion==2:
                self.listar()
            elif opcion==3:
                self.notas_altas()

    def cargar(self):
        for x in range(5):
            nom=input("Ingrese nombre del alumno:")
            self.nombres.append(nom)
            no=int(input("Nota del alumno:"))
            self.notas.append(no)

    def listar(self):
        print("Listado completo de alumnos")
        for x in range(5):
            print(self.nombres[x],self.notas[x])
        print("_____________________")            

    def notas_altas(self):
        print("Alumnos con notas superiores o iguales a 7")
        for x in range(5):
            if self.notas[x]>=7:
                print(self.nombres[x],self.notas[x])
        print("_____________________")                


# bloque principal

alumnos=Alumnos()
alumnos.menu()

Si ejecutamos el programa podemos ver como aparece un menú de opciones y podemos seleccionar para cargar, listar etc.:

clases en Python

El bloque principal del programa es muy sencillo, solo creamos un objeto de la clase Alumno y llamamos posteriormente al método menu:

# bloque principal

alumnos=Alumnos()
alumnos.menu()

Ahora analicemos la clase Alumno, en el método __init__ procedemos a crear dos atributos de tipo lista donde se almacenarán los nombres de alumnos y sus notas:

class Alumnos:

    def __init__(self):
        self.nombres=[]
        self.notas=[]

El método menu muestra una serie de opciones y solicita al operador que elija una de ellas, según cual de ellas selecciona procede a llamar al método respectivo:

    def menu(self):
        opcion=0
        while opcion!=4:
            print("1- Cargar alumnos")
            print("2- Listar alumnos")
            print("3- Listado de alumnos con notas mayores o iguales a 7")
            print("4- Finalizar programa")
            opcion=int(input("Ingrese su opcion:"))
            if opcion==1:
                self.cargar()
            elif opcion==2:
                self.listar()
            elif opcion==3:
                self.notas_altas()

Algo que no utilizamos hasta ahora del lenguaje Python son una forma simplificada de if anidados con la sentencia elif:

            if opcion==1:
                self.cargar()
            elif opcion==2:
                self.listar()
            elif opcion==3:
                self.notas_altas()

Nosotros hasta ahora lo resolvíamos y podemos sin problema seguir utilizando la sintaxis::

            if opcion==1:
                self.cargar()
            else:
                if opcion==2:
                    self.listar()
                else:
                    if opcion==3:
                        self.notas_altas()

Pero podemos comprobar que si hay muchos if anidados la nueva sintaxis es más clara.

El método menu se repite el while mientras no se ingrese en la variable local opcion el valor 4.

El método cargar se llama desde el método menu, en el mismo procedemos a cargar las dos listas paralelas con los nombres de alumnos y sus notas:

    def cargar(self):
        for x in range(5):
            nom=input("Ingrese nombre del alumno:")
            self.nombres.append(nom)
            no=int(input("Nota del alumno:"))
            self.notas.append(no)

El método listar muestra las dos listas paralelas por completo e imprime una línea separadora para que se vea in forma más clara:

    def listar(self):
        print("Listado completo de alumnos")
        for x in range(5):
            print(self.nombres[x],self.notas[x])
        print("_____________________")            

Finalmente el método notas_altas muestra solo los elementos de las listas cuyas notas sean igual o superior a 7:

    def notas_altas(self):
        print("Alumnos con notas superiores o iguales a 7")
        for x in range(5):
            if self.notas[x]>=7:
                print(self.nombres[x],self.notas[x])
        print("_____________________")                

Problema propuesto

  • Confeccionar una clase que administre una agenda personal. Se debe almacenar el nombre de la persona, teléfono y mail
    Debe mostrar un menú con las siguientes opciones:
    1- Carga de un contacto en la agenda.
    2- Listado completo de la agenda.
    3- Consulta ingresando el nombre de la persona.
    4- Modificación de su teléfono y mail.
    5- Finalizar programa.

    Ver video

Solución
ejercicio195.py

class Agenda:

    def __init__(self):
        self.contactos={} # definimos un diccionario para almacenar los datos

    def menu(self):
        opcion=0
        while opcion!=5:
            print("1- Carga de un contacto en la agenda")
            print("2- Listado completo de la agenda")
            print("3- Consulta ingresando el nombre de la persona")
            print("4- Modificacion del telefono y mail")
            print("5- Finalizar programa")
            opcion=int(input("Ingrese su opcion:"))
            if opcion==1:
                self.cargar()
            elif opcion==2:
                self.listado()
            elif opcion==3:
                self.consulta()
            elif opcion==4:
                self.modificacion()

    def cargar(self):
        nombre=input("Ingrese el nombre de la persona:")
        telefono=input("Ingrese el numero de telefono:")
        mail=input("Ingrese el mail:")
        self.contactos[nombre]=(telefono,mail)
        print("______________________________________________")
        
    def listado(self):
        print("______________________________________________")        
        print("Listado completo de la agenda")
        for nombre in self.contactos:
            print(nombre, self.contactos[nombre][0],self.contactos[nombre][1])
        print("______________________________________________")

    def consulta(self):
        print("______________________________________________")        
        nombre=input("Ingrese el nombre de la persona a consultar:")
        if nombre in self.contactos:
            print(nombre," su telefono es",self.contactos[nombre][0],"y su mail es",self.contactos[nombre][1])
        else:
            print("No existe un contacto con ese nombre")
        print("______________________________________________")            

    def modificacion(self):
        print("______________________________________________")        
        nombre=input("Ingrese el nombre de la persona a modificar el telefono y mail:")
        if nombre in self.contactos:
            telefono=input("Ingrese el nuevo telefono:")
            mail=input("Ingrese el nuevo mail:")
            self.contactos[nombre]=(telefono,mail)
        else:
            print("No existe un contaxto con ese nombre")
        print("______________________________________________")         
        

# bloque principal

agenda=Agenda()
agenda.menu()