5
respostas

Código retorna o seguinte erro ao executar...

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

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

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

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

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

class Filme(Programa):
    def _init_(self, nome, ano, duracao):
        self._nome = nome.title()
        self.ano = ano
        self.duracao = duracao
        self._likes = 0

class Serie(Programa):
    def __init__(self, nome, ano, temporadas):
        self._nome = nome.title()
        self.ano = ano
        self.temporadas = temporadas
        self._likes = 0



    vingadores = Filme('vingadores - guerra infinita', 2018, 160)
    vingadores.dar_like()
    print(f'Nome: {vingadores.nome} - Ano: {vingadores.ano} - Duração: {vingadores.duracao} - Likes: {vingadores.likes}')

atlanta = Serie('atlanta', 2018, 2)
atlanta.dar_like()
atlanta.dar_like()
print(f'Nome: {atlanta.nome} - Ano: {atlanta.ano} - Temporadas: {atlanta.temporadas} - Likes: {atlanta.likes}')

LOG: C:\Users\fds\PycharmProjects\python3oo2\venv\Scripts\python.exe C:/Users/fds/PycharmProjects/python3oo2/Modelo.py Traceback (most recent call last): File "C:/Users/fds/PycharmProjects/python3oo2/Modelo.py", line 29, in class Serie(Programa): File "C:/Users/fds/PycharmProjects/python3oo2/Modelo.py", line 38, in Serie vingadores = Filme('vingadores - guerra infinita', 2018, 160) TypeError: init() takes 3 positional arguments but 4 were given

Process finished with exit code 1

5 respostas

A declaração do init da classe Filme está sendo feita com um underscore, portanto o Python está considerando o construtor da classe Programa onde é aceito apenas 3 argumentos (self apesar de não ser especificado ao iniciar um novo objeto, é considerado um argumento)

class Programa:
    def __init__(self, nome, ano):
...

class Filme(Programa):
    def _init_(self, nome, ano, duracao):

Alterando o construtor para dois underscores corrige esse problema

class Filme(Programa):
    def __init__(self, nome, ano, duracao):

Obrigado Felipe!

O código continua retornando um erro ao executar, LOG DO ERRO abaixo do script.

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

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

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

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

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

class Filme(Programa):
    def __init__(self, nome, ano, duracao):
        self._nome = nome.title()
        self.ano = ano
        self.duracao = duracao
        self._likes = 0

class Serie(Programa):
    def __init__(self, nome, ano, temporadas):
        self._nome = nome.title()
        self.ano = ano
        self.temporadas = temporadas
        self._likes = 0



    vingadores = Filme('vingadores - guerra infinita', 2018, 160)
    vingadores.dar_like()
    print(f'Nome: {vingadores.nome} - Ano: {vingadores.ano} '
          f'- Duração: {vingadores.duracao} - Likes: {vingadores.likes}')
atlanta = Serie('atlanta', 2018, 2)
atlanta.dar_like()
atlanta.dar_like()
print(f'Nome: {atlanta.nome} - Ano: {atlanta.ano} '
      f'- Temporadas: {atlanta.temporadas} - Likes: {atlanta.likes}')

C:\Users\fds\PycharmProjects\python3oo2\venv\Scripts\python.exe C:/Users/fds/PycharmProjects/python3oo2/Modelo.py Traceback (most recent call last): File "C:/Users/fds/PycharmProjects/python3oo2/Modelo.py", line 29, in class Serie(Programa): File "C:/Users/fds/PycharmProjects/python3oo2/Modelo.py", line 39, in Serie vingadores.dar_like() AttributeError: 'Filme' object has no attribute 'dar_like'

Process finished with exit code 1

Tem um erro na indentação dos métodos da classe Programa, todos estão dentro da declaração do init, ela deve ficar assim:

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

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

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

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

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

Obrigado Felipe, acabei passando batido na identação, vlw!