1
resposta

[Dúvida] TypeError: object.__init__() takes exactly one argument

Bom dia, alguem pode me ajudadr com este erro, revi os videos e não vi nada de diferente.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

item_cardapio

class ItemCardapio:
    def __int__(self,nome,preco):
        self._nome = nome
        self._preco = preco
        

prato

from modelo.cardapio.item_cardapio import ItemCardapio

class Prato(ItemCardapio):
       def __init__(self,nome,preco,descricao):
              super().__init__(nome,preco)
              self.descricao = descricao

       def __str__(self):
              return self._nome
              

bebida

from modelo.cardapio.item_cardapio import ItemCardapio

class Bebida(ItemCardapio):
        def __init__(self,nome,preco,tamanho):
               super().__init__(nome,preco)
               self.tamanho = tamanho

        def __str__(self):
              return self._nome
              

app.py

from modelo.restaurante import Restaurante 
from modelo.cardapio.bebida import Bebida
from modelo.cardapio.prato import Prato

restaurante_pequin = Restaurante('Pequin', 'Chines')
bebida_suco = Bebida('Suco de Melancia', 5.0,'grande')
prato_paozinho = Prato('Paozinho', 2.00,'saPao')

def main():
        print(bebida_suco)
        print(prato_paozinho)

if __name__ == '__main__':
     main()
1 resposta

Bom dia! Esse erro é bem comum e passa batido mesmo quando a gente revê os vídeos, então fica tranquilo o problema não é de conceito, é um detalhe de escrita.

Vamos por partes, olhando exatamente para o que o erro está dizendo.

A mensagem:

TypeError: object.__init__() takes exactly one argument (the instance to initialize)

está indicando que, quando você chama super().__init__(nome, preco), o Python não encontrou um __init__ válido na classe pai (ItemCardapio).
Aí ele “sobe” mais um nível e acaba chamando o __init__ da classe object, que é a classe base de tudo em Python — e esse __init__ realmente não aceita parâmetros além do self.

O motivo disso está aqui:

class ItemCardapio:
    def __int__(self, nome, preco):
        self._nome = nome
        self._preco = preco

Percebeu o detalhe?
O método foi definido como __int__, mas o construtor em Python precisa se chamar __init__ (com dois “i”).

Como o nome está errado, o Python simplesmente ignora esse método como construtor. Para ele, ItemCardapio não tem __init__, então o super().__init__(nome, preco) acaba chamando o object.__init__(), que não aceita esses argumentos — daí o erro.

A correção é só ajustar o nome do método:

class ItemCardapio:
    def __init__(self, nome, preco):
        self._nome = nome
        self._preco = preco

Depois disso, o fluxo fica certinho:

  • Bebida e Prato chamam super().__init__(nome, preco)
  • Esse super() agora encontra o __init__ correto em ItemCardapio
  • Os atributos _nome e _preco são inicializados normalmente
  • O programa roda sem o TypeError

Ou seja: a lógica estava certa, a herança está correta, foi só um pequeno typo no nome do método que causou todo o problema.