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

O "@nome.setter" não está funcionando

Prezados, boa tarde,

Fiz as modificações com o conceito de herança, porém quando faço o teste no console através do Pycharm, não consigo acessar o "@nome.setter" para modificar o nome do filme ou série. Segue código:

class Programa():
    def __init__(self,nome,ano):
        self._nome = nome.title()
        self._ano = ano

    @property
    def nome(self):
        return self._nome

    @nome.setter
    def nome(self,novo_nome):
        self._nome = novo_nome

class Filme(Programa):
    def __init__(self, nome,ano,duracao):
        super(Filme, self).__init__(nome,ano)
        self._duracao = duracao
        self._like = 0

    @property
    def like(self):
        return self._like

    @property
    def duracao(self):
        return self._duracao

    def dar_like(self):
        self._like =+ 1

    def info_filme(self):
        print("O nome do filme é",f'{self.nome}',"e tem duração de",f'{self.duracao} minutos',
              f'- Total de like:'
              f' {self.like}')

class Serie(Programa):
    def __init__(self,nome,ano,temporadas):
        super(Serie, self).__init__(nome, ano)
        self._temporadas = temporadas
        self._like = 0

    @property
    def like(self):
        return self._like

    @property
    def temporadas(self):
        return self._temporadas

    def info_serie(self):
        print("O nome da serie é",f'{self.nome}',"e tem duração de",f'{self.temporadas} temporadas',
              f'- Total de like: {self.like}')

    def dar_like(self):
        self._like =+ 1

Por exemplo, se eu criar o seguinte objeto no console do pycharm: x = Filme('Entrando numa fria', '2000', 2). E depois tentar modificar o nome do filme com o seguinte código:

x.nome('Eu, eu mesmo e Irene'). O console dá um erro de atributo. Contudo se eu tentar mudar o nome "x.nome = 'Eu, eu mesmo e Irene'" ou "x.nome = 'Eu, eu mesmo e Irene'" a modificação é feita. Ou seja, eu não consigo alterar pelo getter.

Desde ja obrigado e se for um erro conseitual meu peço desculpas pelo transtorno.

2 respostas
solução!

Boa tarde Diogo, como vai?

Acontece que ao executa o codigo "x.nome = 'Irene'" você está sim, utilizando o setter, no python graças a property(@), você não precisa passar a variavel como um parametro, assim como quando deseja chamar o getter de nome você não o faz dessa forma: x.nome() e sim dessa x.nome

Uma forma legal de você tirar a prova disso é fazendo dentro do setter alguma modificação no atributo dentro do setter, exemplo:

    @nome.setter
    def nome(self,novo_nome):
        self._nome = str(novo_nome) + ' Esse é meu nome'

    x = Filme('Entrando numa fria', '2000', 2)

    x.nome = 'Irene'

    print(x.nome)

    #A saida sera algo como: 'Irene Esse é meu nome'

Espero que tenha ajudado e que consiga botar o exemplo em pratica! Bons estudos!

Ok José, obrigadão pelos esclarecimentos!

Abraços,