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

Uso das () - 'NoneType' object is not callable

class Filme:
    def __init__(self, name, year, director):
        self.__name = name
        self.year = year
        self.director = director
        self.__likes = 0

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, new_name):
        self.name = new_name

    @property
    def dar_likes(self):
        self.__likes += 1

    def likes(self):
        return self.__likes


class Serie:
    def __init__(self, name, year, seasons):
        self.__name = name
        self.year = year
        self.seasons = seasons
        self.__likes = 0

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, new_name):
        self.name = new_name

    @property
    def likes(self):
        return self.__likes

    def dar_likes(self):
        self.__likes += 1

batman = Filme('Batman', 2008, 'João')
unbeliavable = Serie('Unbeliavable', 2011, 1)

batman.dar_likes()
print('Nome: {}, Ano: {}, Diretor: {}, Likes: {}'. format(batman.name, batman.year, batman.director, batman.likes()),
      'e Nome: {}, Ano: {}, Temporadas: {}'.format(unbeliavable.name, unbeliavable.year, unbeliavable.seasons))
print(batman.likes)

Pessoal, tudo bem? Criei essas linhas de código para treinar as lições passadas, mas estou com uma dúvida. Quando chamo o método batman.dar_likes com () o prompt retorna esse erro: Erro acusadoSe eu chamo apenas batman.dar_likes sem os (), o programa roda normalmente e apresenta o atributo Likes como 1.

O contrário acontecer para o print do batman.likes. Se eu uso (), ele me devolve o valor do atributo. Porém, sem os (), o prompt apresenta o endereço na memória: Endereço na memória Acompanhando os vídeos e o código do curso, o professor chama o método dar_likes com () e o getter likes sem (). O que pode estar acontecendo? Conseguem me ajudar?

abs, João

4 respostas

Eu acho que você não pode definir um setter (que vai fazer uma alteração) como @Property. Do que eu entendi quando você vai alterar as propriedades, você usa o setter @nomedoatributo.setter, quando você só vai ler você usa o @Property.

Seu método dar_likes tem que ser normal, o método likes é que é property, pq ele só vai ler, não vai alterar nada.

Tenta só alterar isso:

@property
def dar_likes(self):
    self.__likes += 1

def likes(self):
    return self.__likes

pra isso:

def dar_likes(self):
    self.__likes += 1

@property
def likes(self):
    return self.__likes

Por isso que o professor chama o dar_likes com () e o likes, sem. Dar likes é uma função comum, likes é uma property :)

Fala, Pedro, beleza? Obrigado pela sua resposta!

Sabe o que acho que era? A ordem dos métodos relacionados ao objeto self.likes. Apenas inverti a ordem e deu certo. Se liga:

class Filme:
    def __init__(self, name, year, director):
        self.__name = name
        self.year = year
        self.director = director
        self.__likes = 0

    def likes(self):
        return self.__likes

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, new_name):
        self.name = new_name

    @property
    def likes(self):
        return self.__likes

    def dar_likes(self):
        self.__likes += 1

Confesso que não sei a razão ainda para ser dessa forma, mas funcionou. Valeu!

solução!

Você não alterou só a ordem, você trocou o property de lugar. O problema é usar @property num método que altera um atributo... pelo menos foi o que eu entendi. Você tirou o property do dar like, e deixou no likes, aí dá boa ^^ Mas pode ser a ordem também. Tenta deixar o método dar_like com o @property e veja se funciona... Abraço

É, acho que faz sentido. Tanto é que o object.likes só vinha com (), ou seja, não era uma property. Ao inverter a ordem, transformei o .like em property e tirei o dar_likes dessa condição. Acho que é isso. Valeu, Pedro! Abraços!