1
resposta

Duvida no código

class Livro:

    total_livros = []

    def __init__(self, titulo, autor, ano):
        self.titulo = titulo
        self.autor = autor
        self.ano = ano
        self.disponivel = True
        Livro.total_livros.append(self)

    def __str__(self):
        return f"{self.titulo} por {self.autor} ano de publicação {self.ano}"

    @property
    def emprestar(self):
        if self.disponivel:
            self.disponivel = False
            return "Livro emprestado com sucesso!"
        else:
            return "Livro não está disponível para empréstimo."

    @property
    def devolver(self):
        if not self.disponivel:
            self.disponivel = True
            return "Livro devolvido com sucesso!"
        else:
            return "Livro já está disponível."

    @classmethod
    def verificar_disponibilidade(cls, ano):
        livros_disponiveis = []
        for livro in cls.total_livros:
            if livro.disponivel and livro.ano == ano:
                livros_disponiveis.append(livro)
        for livro in livros_disponiveis:
            print(f"Título: {livro.titulo}, Autor: {livro.autor}, Ano: {livro.ano}")

livro1 = Livro("Dom Casmurro", "Machado de Assis", 1899)
livro2 = Livro("O Alquimista", "Paulo Coelho", 1988)
livro3 = Livro("Gabriela Cravo e Canela", "Jorge Amado", 1988)
print(livro1)
print(livro1.emprestar)
print(livro1.disponivel)
print(Livro.verificar_disponibilidade(1988))

Primeira dúvida: Para não ter um retorno de espaço de memoria usei o print. Porém o retorno do print é um None. Isso estaria errado?

Segunda dúvida É pedido para que o verificar_disponibilidade seja um metodo estatico. Colocando ele como metodo da classe estaria errado?

1 resposta

Olá, Breno.

Tudo bem?

Primeira dúvida:

Você mencionou que ao usar o print para chamar o método verificar_disponibilidade, o retorno é None. Isso acontece porque o método verificar_disponibilidade está configurado para imprimir diretamente os livros disponíveis e não retornar uma lista ou outro valor. Quando você usa print(Livro.verificar_disponibilidade(1988)), o método executa suas instruções (imprime os livros disponíveis), mas não retorna nada, resultando em None sendo impresso.

Para corrigir isso, você pode modificar o método verificar_disponibilidade para que ele retorne uma lista de livros disponíveis em vez de apenas imprimir. Veja como ficaria:

class Livro:

    # ... (restante da classe)

    @classmethod
    def verificar_disponibilidade(cls, ano):
        livros_disponiveis = []
        for livro in cls.total_livros:
            if livro.disponivel and livro.ano == ano:
                livros_disponiveis.append(livro)
        return livros_disponiveis

# Exemplo de uso:
livros_disponiveis = Livro.verificar_disponibilidade(1988)
for livro in livros_disponiveis:
    print(f"Título: {livro.titulo}, Autor: {livro.autor}, Ano: {livro.ano}")

Segunda dúvida:

Você mencionou que é pedido para que o verificar_disponibilidade seja um método estático. Métodos estáticos são definidos com o decorador @staticmethod e não recebem a referência da classe (cls) como primeiro argumento. Eles são usados quando a lógica do método não depende de nenhum atributo da classe.

No entanto, no seu caso, como você está acessando cls.total_livros, faz mais sentido que seja um método de classe (@classmethod). Mas se for realmente necessário que seja um método estático, você precisará passar explicitamente a lista de livros para ele. Veja como poderia ficar:

class Livro:

    # ... (restante da classe)

    @staticmethod
    def verificar_disponibilidade(livros, ano):
        livros_disponiveis = []
        for livro in livros:
            if livro.disponivel and livro.ano == ano:
                livros_disponiveis.append(livro)
        return livros_disponiveis

# Exemplo de uso:
livros_disponiveis = Livro.verificar_disponibilidade(Livro.total_livros, 1988)
for livro in livros_disponiveis:
    print(f"Título: {livro.titulo}, Autor: {livro.autor}, Ano: {livro.ano}")

Dessa forma, você passa explicitamente a lista de livros para o método estático.

Espero ter ajudado e bons estudos!