Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] não consigo fazer a ativida 4 por que nao entendo como uso o @staticmethod

class Livro: 
    todos_livros = []
    def __init__(self,titulo,autor,ano_publicacao):
        self._titulo = titulo
        self._autor = autor
        self.ano_publicacao = ano_publicacao
        self._disponivel = True
        Livro.todos_livros.append(self)
    def __str__(self): 
        return f'Titulo: {self._titulo}|Autor: {self._autor}|Ano de publicação: {self.ano_publicacao}'

    def empresta(self):
        self._disponivel = False  
    
   #Adicione um método estático chamado verificar_disponibilidade à classe Livro que recebe um ano como parâmetro e retorna uma lista dos livros disponíveis publicados nesse ano.
    @staticmethod
    def verificar_disponibilidade(ano):
        return [livro for livro in Livro.todos_livros if livro.ano_publicacao == ano and livro.disponivel]



livro1 =Livro('A Menina que Roubava Livros','Markus Zusak', 2005 )
livro1.empresta()
print(f'Livro disponovel ? {livro1._disponivel}')

livro2 =Livro('It: A Coisa','Stephen King.',1986)
livro2.empresta()
print(f'Livro disponovel ? {livro2._disponivel}')

livro3 =Livro('Verith',' Colleen Hoover',2018)
print(f'Livro disponovel ? {livro3._disponivel}')


livros_disponiveis_2018 = Livro.verificar_disponibilidade(2018)
for livro in livros_disponiveis_2018:
    print(livro)

print(livro1)
print(livro2)
print(livro3)
2 respostas
solução!

Olá, Cauã! Como vai?

Você está enfrentando dificuldade com o uso do @staticmethod porque o método está acessando um atributo que não existe. O problema aqui é que, na sua classe, o atributo se chama _disponivel, mas no método estático você usa livro.disponivel.

Um método estático não depende de um objeto específico (self). Ele trabalha com dados que você passa como parâmetro ou com atributos da própria classe. Neste ponto, ele percorre a lista Livro.todos_livros e filtra os livros conforme a regra definida.

Ajuste seu código assim:


@staticmethod
def verificar_disponibilidade(ano):
    return [
        livro
        for livro in Livro.todos_livros
        if livro.ano_publicacao == ano and livro._disponivel
    ]

Esse código percorre todos os livros cadastrados, verifica se o ano de publicação é o informado e se o livro ainda está disponível.

Veja este exemplo de uso do método estático:


livros_disponiveis_2018 = Livro.verificar_disponibilidade(2018)

for livro in livros_disponiveis_2018:
    print(livro)

Neste exemplo, o método é chamado diretamente pela classe Livro, sem precisar criar um objeto. Ele retorna apenas os livros disponíveis daquele ano.

Pontos importantes:

  • @staticmethod não usa self
  • Ele acessa dados da classe, como Livro.todos_livros
  • Deve usar exatamente o nome dos atributos definidos na classe

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

muito obrigado agora funcionou