Я не понимаю следующую ошибку в этом коде

Я пытаюсь создать этот код для имитации библиотеки, и я не понимаю, почему возникает следующая ошибка:

в ShowMenu () NameError: имя 'ShowMenu' не определено;

Существует один класс для определения книг, а другой класс для определения авторов. Это класс библиотеки, где я терплю неудачу.

class Biblioteca:
    def __init__(self):
        self.ListaLibros = []
    def NumeroLibros(self):
        return len(self.ListaLibros)
    def AñadirLibros(self,libro):
        self.ListaLibros = self.ListaLibros + [libro]
    def MostrarBiblioteca(self):
        print ("#############################")
        for item in self.ListaLibros:
            item.MostrarLibro()
        print ("#############################")
    def BorrarLibro(self,titulo):
        encontrado = False
        posicionaborrar = -1
        for item in self.ListaLibros:
            posicionaborrar +=1
            if item.ObtenerTitulo() == titulo:
                encontrado = True
                break
            if encontrado:
                del self.ListaLibros[posicionaborrar]
                print ("Libro borrado correctamente")
            else:
                print ("Libro no encontrado")
    def MostrarMenu():
        print ("MENU 1)Añadir Libro \n2)Mostrar Biblioteca \n3)Borrar Libro \n4)¿Número de libros? \n5)Salir")
    def AñadirLibroABiblioteca(biblioteca):
        titulo = input("Introduzca el titulo: ")
        autornombre = input("Introduzca nombre del autor: ")
        autorapellido = input("Introduzca apellidos del autor: ")
        autor = Autor(nombre,apellidos)
        libro = Libro(titulo)
        libro.AñadirAutor(autor)
        biblioteca.AñadirLibro(libro)
        return biblioteca
    def MostrarBiblioteca(biblioteca):
        biblioteca.MostrarBiblioteca()
    def BorrarLibro(biblioteca):
        titulo = input("Introduzca el titulo del libro a borrar")
        biblioteca.BorrarLibro(titulo)
    def NumeroLibros(biblioteca):
        print ("El número de libros en la biblioteca es: ",biblioteca.NumeroLibros())

fin = False
biblioteca = Biblioteca()

while fin is False:
    MostrarMenu()
    opcion = int(input("Seleccione una opcion:"))
    if (opcion == 1):
        biblioteca = AñadirLibroABiblioteca(biblioteca)
    elif (opcion == 2):
        MostrarBiblioteca(biblioteca)
    elif (opcion == 3):
        BorrarLibro(biblioteca)
    elif (opcion == 4):
        NumeroLibros(biblioteca)
    elif (opcion == 5):
        fin = True

print ("Hasta pronto")
1
задан 28.11.2019, 15:08
1 ответ

Ошибка выходит, потому что MostrarMenu - один funciГіn estГЎtica определенная внутри Biblioteca. К существу одна funciГіn estГЎtica ты можешь призывать ее двух различных форм:

while fin is False:
    Biblioteca.MostrarMenu() # opcion 1 - acceso via el nombre de la clase
    biblioteca.MostrarMenu() # opcion 2 - acceso via instancia de la clase

Ну, вторая opciГіn как таковая не будет функционировать прямо. Для того, чтобы оно функционировало, нужно заявлять заблаговременно mГ©todo как estГЎtico, (Благодаря @abulafia из-за того, что замечает деталь):

class Biblioteca:
    @staticmethod
    def MostrarMenu():

Оставшаяся часть вызовов tambiГ©n estГЎn плохо, так как - функции члены библиотеки. В этом случае это не функции estГЎticas, потом ты нуждаешься в одной инстанции таких Biblioteca как пункт отправления:

if (opcion == 1):
    biblioteca.AñadirLibroABiblioteca()
elif (opcion == 2):
    biblioteca.MostrarBiblioteca()
elif (opcion == 3):
    biblioteca.BorrarLibro()
elif (opcion == 4):
    biblioteca.NumeroLibros()
elif (opcion == 5):
    fin = True

В другом порядке вещей, я предлагаю тебе отделить функции с одним или двумя lГ-neas в мишени... Иметь все cГіdigo compactado не будет не облегчать ни Ваше чтение ни Ваше содержание

2
ответ дан 01.12.2019, 10:41
  • 1
    Вторая opció n, который ты помещаешь сначала: biblioteca.MostrarMenu() fallará попробовав происходить как pará метр biblioteca в mé совсем, так как в é ste меня не признает себя self как pará метр. Só funcionará следовательно первая форма Biblioteca.MostrarMenu(). Для того, чтобы могли функционировать оба, deberí когда декоратор @staticmethod появляется перед definició n этого mé все. – abulafia 28.11.2019, 17:29
  • 2
    @abulafia верный, я pasó – eferion 28.11.2019, 18:10