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

Herança Python

Olá, estou tendo esse problema na hora de testar a minha classe "TypeError: super() argument 1 must be type, not classobj"

>>> vip = Perfil_Vip('bruno','999999','lasalle','bru')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "models.py", line 25, in __init__
    super(Perfil_Vip, self).__init__(nome, telefone, empresa)
TypeError: super() argument 1 must be type, not classobj
>>>
# -*- coding: utf-8 -*-
class Perfil():
    'Classe para medelar perfil de usuarios'
    def __init__(self,nome,telefone,empresa):
        self.nome = nome
        self.telefone = telefone
        self.empresa = empresa
        self.__curtidas = 0

    def imprimir(self):
        print 'Nome: %s, telefone: %s, Empresa: %s' % (self.nome,self.telefone,self.empresa)

    def curtir(self):
        self.__curtidas+=1

    def obter_curtidas(self):
        return self.__curtidas

class Perfil_Vip(Perfil):
   'Classe padrão para perfis de usuários VIPs'

   def __init__(self, nome, telefone, empresa, apelido):

      super(Perfil_Vip, self).__init__(nome, telefone, empresa)
      self.apelido = apelido

   def obter_creditos(self):
      return super(Perfil_Vip, self).obter_curtidas() * 10.0
4 respostas

Ola Bruno, beleza? meu amigo não entendo nada de Python, mas observando seu código eu poderia chutar que seria na hora de você chamar o seu super como o erro ja ta falando que é la kkk.

>>> vip = Perfil_Vip('bruno','999999','lasalle','bru')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "models.py", line 25, in __init__
    super(Perfil_Vip, self).__init__(nome, telefone, empresa)
TypeError: super() argument 1 must be type, not classobj
>>>

Aqui você ta chamando o super com 3 parametros correto? mas olhando o seu código você criou podemos chamar de construtor no Python? kkk olhando você criou um construtor com 4 paramentros.

def __init__(self, nome, telefone, empresa, apelido):

E está passando somente 3 no super, cara me desculpa se esse meu chute nao tiver nada ver com sua duvida. Abraços

solução!

Sua classe perfil precisa herdar object. Acho que é isso. Não vejo python a bastante tempo.

seu código está atualmente assim:

class Perfil():
    ..........

eu copei e testei com:

class Perfil(object):
    ..........

e compilou normal. Assista novamente a aula e veja se ele não usou o object.

vip = Perfil_Vip('bruno','999999','lasalle','bru')
[Finished in 0.0s]

EDIT: Ah. notei que você usou print sem parenteses, ou seja, você ta usando provavelmente python 2.7. Se o curso for em python 3+, como o 3.5, aparentemente a classe pai não precisa mais dizer que é um objeto. Se a aula não tem o objeto e usa python3, esse é o detalhe.

Como disse o Felipe, o problema está na falta do object na classe Perfil

class Perfil(object):

Ao passar o object ela passa a ser uma classe "new-style", no python2 a chamada do super() só funcionam se utilizarmos essa abordagem "new-style".

Na versão 3.5 (Não sei se todas as versões 3.x) não declarar o object na superclasse não tem problema, contudo é sempre bom declarar.

Agora foi. Eu estou usando python 2.7 sim, Obrigado a todos!!