4
respostas

Cap. 12 Métodos estáticos - dúvida

Após importar a classe Perfil com o comando "from models import Perfil" eu rodo o comando "perfis = Perfil.gerar_perfis('perfis.csv')", que retorna o erro "Traceback (most recent call last): File "", line 1, in AttributeError: type object 'Perfil' has no attribute 'gerar_perfis'"

Não consigo identificar o que causa o erro.

Segue o código do arquivo models.py:

# -*- coding: utf-8 -*-

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

    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, Curtidas: %s" % (self.nome, self.telefone, self.empresa, self.__curtidas)   

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

        def obter_curtidas(self):
            return self.__curtidas

        @classmethod
    def gerar_perfis(classe, nome_arquivo):
        arquivo = open(nome_arquivo,'r')
        perfis = []
        for linha in arquivo:
          valores = linha.split(',')
          perfis.append(classe(*valores))
        arquivo.close()
        return perfis

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

class Data(object):
   def __init__(self, dia, mes, ano):
      self.dia = dia
      self.mes = mes
      self.ano = ano

   def imprime(self):
      print '%s/%s/%s' % (self.dia, self.mes, self.ano)

class Pessoa(object):
    def __init__(self, nome, peso, altura):
        self.nome = nome
        self.peso = float(peso)
        self.altura = float(altura)

    def imprime(self):
        imc = self.peso / (self.altura **2)
        print 'O IMC de %s é: %s ' %(self.nome, imc)
4 respostas

Olá Anderson, boa noite!

O erro diz:

 type object 'Perfil' has no attribute 'gerar_perfis'"

ou seja, Perfil não possui o atributo gerar_perfis. Como este é um atributo de classe, precisa da anotação @classmethod - que no seu código não está seguindo a indentação corretamente:

   @classmethod
 def gerar_perfis(classe, nome_arquivo):

Acredito que o interpretador não está reconhecendo como atributo de classe por conta disso. Arrume a indentação e veja se funciona:


@classmethod
def gerar_perfis(classe, nome_arquivo):

Espero ter ajudado e bons estudos!

Mudei a indentação e continua dando erro.

# -*- coding: utf-8 -*-

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

    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, Curtidas: %s" % (self.nome, self.telefone, self.empresa, self.__curtidas)   

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

        def obter_curtidas(self):
            return self.__curtidas

   @classmethod
    def gerar_perfis(classe, nome_arquivo):
        arquivo = open(nome_arquivo,'r')
        perfis = []
        for linha in arquivo:
          valores = linha.split(',')
          perfis.append(classe(*valores))
        arquivo.close()
        return perfis

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

class Data(object):
   def __init__(self, dia, mes, ano):
      self.dia = dia
      self.mes = mes
      self.ano = ano

   def imprime(self):
      print '%s/%s/%s' % (self.dia, self.mes, self.ano)

class Pessoa(object):
    def __init__(self, nome, peso, altura):
        self.nome = nome
        self.peso = float(peso)
        self.altura = float(altura)

    def imprime(self):
        imc = self.peso / (self.altura **2)
        print 'O IMC de %s é: %s ' %(self.nome, imc)

Erro:

"Traceback (most recent call last): File "", line 1, in File "models.py", line 21 @classmethod ^ IndentationError: unindent does not match any outer indentation level "

Olá Anderson, boa noite!

O erro continua sendo de indenteção como diz na sua stacktrace:

"Traceback (most recent call last): 
  File "", line 1, in File "models.py", line 21 
    @classmethod 
       ^ IndentationError: unindent does not match any outer indentation level "

Precisa seguir a mesma indentação do nome do método:

class Perfil(object):
    # código omitido

    @classmethod
    def gerar_perfis(classe, nome_arquivo):
        #código omitido

No Sublime Text existe um menu que pode ajudar: View / Identation / Convert Identation To Tabs

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software