Foros Python

Versión completa: Ejercicio de herencia (Agenda)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
ENUNCIADO:
El siguiente ejercicio consiste en escribir un programa para gestionar una agenda telefónica con los nombres y los teléfonos de los conocidos de una persona. El programa incorporará las funciones para:
• Consultar el teléfono de una persona.
• Añadir el teléfono de una persona nueva.
• Eliminar el teléfono de una persona.
La agenda debe estar guardada en el fichero de texto agenda.txt donde el nombre de las personas y su teléfono deben aparecer separados por comas y cada persona debe aparecer en una línea distinta.

Código:
import os

class Agenda():
      def __init__(self,persona,fichero):
          self.persona,self.fichero=persona,fichero
           
      def obtener_telefono(fichero,persona):
            try:
                f=open(fichero,'r')
            except FileNotFoundError    :
                return('¡El fichero' +fichero + 'no existe!\n')
            else:
                directorio =f.readlines()
                f.close()
                directorio=dict([tuple(line.split(','))for line in directorio
                ])
                if persona in directorio:
                    return directorio[persona]
                else:
                    return('¡La persona' +persona+ 'no existe\n')
                     
      def insertar_telefono(fichero,persona,telefono):
            try:
                f=open(fichero,'a')
            except FileNotFoundError:
                return('¡El fichero ' + fichero + 'no existe\n')
            else:
                f.write(persona+','+ telefono+'\n')   
                f.close()
                return ('El telefono se ha agregado.\n')
         
      def eliminar_telefono(fichero,persona):
            try:
                f=open(fichero,'r')
            except FileNotFoundError:
                return ('¡El fichero ' + fichero + 'no existe!\n')
            else:
                directorio =f.readlines()
                f.close()
                directorio=dict([tuple(line.split(','))for line in directorio])
                if persona in directorio:
                    del directorio[persona]
                    f=open(fichero,'w')
                    for nombre,telefono in directorio.items():
                        f.write(nombre + ',' + telefono)
                    f.close()
                    return ('La persona '+ persona + 'no existe\n')   
class Menu(Agenda):
    def __init__(self,persona,fichero,nombre,telefono,apellidos,email):
        super().__init__(persona,fichero)
        self.nombre,self.apellidos=nombre,apellidos
        self.telefono,self.email=telefono,email
    def directorio():
        fichero='agenda.txt'
        while True:
            opcion=Menu()
            if opcion=='1':
                nombre=input('Introduzca el nombre de la persona:')
                print(obtener_telefono(fichero,nombre))
            elif opcion == '2':
                nombre=input('Introduzca el nombre de la persona:')
                telefono=int(input('Introduzca el telefono de la persona:')) 
                print(insertar_telefono(fichero,nombre,telefono))
            elif opcion == '3':
                nombre=input('Introduzca el nombre de la persona:')
                print(eliminar_telefono(fichero,nombre))
            elif opcion =='4':
                print(crear_directorio(fichero)) 
            else:
                break
        return
   
    def crear_directorio(self,fichero):
      if os.path.isfile(self.fichero):
          pregunta=input('El fichero'+self.fichero+ 'ya existe.¿Desea borrarlo? (S/N)?')   
          if pregunta =='N':
              return 'No se ha añadido el fichero porque ya existe.\n'
          f=open(self.fichero,'w')
          f.close()
          return 'Se ha añadido el fichero.\n' 
   
    def crear_menu():
        print('Gestion de la agenda telefonica')
        print('*********************************')
        print('(1)-Obtener un telefono')
        print('(2)-Insertar un telefono')
        print('(3)-Eliminar un telefono')
        print('(4)-Crear la agenda telefonica')
        print('(0)-Salir')
        opcion=input('Seleccione la opcion elegida:')
        return opcion     
    crear_menu() 

DUDA:
Me dice que en el método directorio que no están definidos los metodos,cuando los estoy invocando.¿Donde esta el fallo?.Muchas gracias
Hola, ¿cómo estás?

Todos los métodos de una clase deben tener un primer argumento "self". Eso está faltando en tu método directorio(). Además, para invocar un método asimismo necesitás el self, por lo cual líneas como esta

Código:
print(obtener_telefono(fichero,nombre))

deberían ser:

Código:
print(self.obtener_telefono(fichero,nombre))

Por otro lado, no veo cómo la herencia viene a solucionar algún problema en este ejercicio. ¿De qué modo un menú es una especie de agenda? Está bien que una agenda sea una clase, pero para el menú me parece innecesario, y mucho menos que herede de una agenda.

Te dejo algunos artículos sobre orientación a objetos que tal vez te sirvan para aclarar estos conceptos. Sobre herencia: https://tutorial.recursospython.com/clases/. Sobre POO en general en Python: https://recursospython.com/guias-y-manua...a-objetos/.

Saludos
Hola Francisco,


He querido hacer este ejercicio mediante herencia,por un lado no viene a solucionar nada en este ejercicio,y por otro lado la agenda hace referencia,por llamarlo de algúna forma, al método crear_menú(),donde esta la gestión de la agenda telefonica.Lo he llamado así como podria haberlo llamado de otra forma.No se si me explico bien.No se si tu lo hubieras hecho con herencia este tipo de ejercicio.
Por otro lado he corregido ese fallo tonto de no haberme dado cuenta del parámetro self tanto en directorio(self) como a la hora de invocarlo con el parámetro self,pero ahora tengo otro problema al ejecutarlo.persona:')

Me da este fallo,no se ejecuta correctamente:


Gestion de la agenda telefonica
*********************************
(1)-Obtener un telefono
(2)-Insertar un telefono
(3)-Eliminar un telefono
(4)-Crear la agenda telefonica 
(0)-Salir
Seleccione la opcion elegida:2 
PS C:\Users\seten\PYTHON


Como podrás ver no sale la opción Insertar un teléfono ni ningún otra opción.
Lo mismo al hacer este ejercicio mediante herencia lo complico aun mas,y debería hacerlo solo con funciones ,pero quería hacerlo elegante el ejercicio


Un saludo cordial,
Yo primero trataría de resolverlo sin usar clases, solo funciones. Una vez que lo tengas listo de esa manera, pensar cómo implementarlo usando orientación a objetos, si es que tiene sentido. Insisto en que una funcionalidad de menú no tiene mucho sentido usando clases. Sí en todo caso la agenda, pero te covnendría empezar por algo más simple sin orientación a objetos. Y te vuelvo a recomendar los enlaces anteriores para aclarar algunos conceptos que por lo que veo están algo confusos en tu código.

Saludos