Trilha de aprendizado · Nível 7 · Tutorial 1

Criar objetos com classes e métodos de instância

Definir uma classe simples, inicializar seus objetos e implementar métodos que consultam ou alteram o estado de cada instância.

  • Nível: Iniciante
  • Duração: 24 min
  • 8 passos
Criar objetos com classes e métodos de instância

O que você vai percorrer

  1. Uma classe, vários objetos Entenda a diferença entre uma classe e os objetos concretos criados a partir dela, identificando estado e comportamento. 2 min
  2. Definir a classe e inicializar um objeto Reconheça a estrutura de uma classe simples, inicialize seus atributos com __init__ e crie uma instância pela chamada da classe. 4 min
  3. Separar atributos de variáveis locais Identifique quais valores permanecem associados a uma instância e diferencie atributos de parâmetros e variáveis locais. 3 min
  4. Consultar o estado com métodos de instância Defina um método que consulta a pontuação de uma instância e entenda como self identifica o objeto que recebeu a chamada. 3 min
  5. Alterar o estado por uma operação Implemente um método que recebe uma quantidade, atualiza a pontuação da instância e diferencie o efeito da operação de seu valor de retorno. 3 min
  6. Acompanhar duas instâncias Preveja e confira como chamadas intercaladas alteram separadamente o estado de dois objetos. 3 min
  7. Reconhecer um atributo inexistente Leia um AttributeError, identifique o atributo ausente e corrija a inconsistência que provocou a falha. 2 min
  8. Aplicação final: dois contadores em ação Implemente a classe ContadorPontos, execute uma sequência com duas instâncias e explique como cada objeto mantém sua própria pontuação. 4 min

O que você vai aprender

  • Distinguir uma classe das instâncias criadas a partir dela.
  • Definir atributos de instância durante a inicialização com __init__.
  • Implementar métodos que usam self para acessar o estado do objeto.
  • Criar duas instâncias e acompanhar seus estados após chamadas de métodos.

Antes de começar

  • Definir funções com parâmetros e retorno
  • Controlar o escopo e o estado das funções
  • Controlar referências e cópias de coleções

Passo 1 de 8

Uma classe, vários objetos

Entenda a diferença entre uma classe e os objetos concretos criados a partir dela, identificando estado e comportamento.

Definição e objetos concretos

Uma definição, vários objetos

Uma classe define um tipo de objeto ao reunir:

  • estado: os dados que cada objeto mantém;
  • comportamento: as operações que esses objetos podem realizar.

Uma instância é um objeto concreto criado a partir dessa definição. A mesma classe pode originar várias instâncias, cada uma com seu próprio estado.

Classes não substituem todas as funções: elas são úteis quando queremos representar elementos que combinam dados próprios e operações relacionadas a esses dados.

Da classe para duas instâncias

Observe que uma única definição serve de origem para dois contadores distintos.

Diagrama com a definição ContadorPontos ligada a um contador de Ana com 10 pontos e outro de Bruno com 25 pontos.

A classe define o que os contadores têm e fazem; Ana e Bruno são objetos distintos, com identificação e pontuação próprias.

Estado e comportamento no exemplo

O modelo ContadorPontos

Nos próximos passos, usaremos a classe conceitual ContadorPontos.

Cada contador representa um participante. Seu estado é formado pelo nome e pela quantidade atual de pontos. Seus comportamentos permitem consultar a pontuação e adicionar novos pontos.

Se dois participantes tiverem contadores, uma alteração no contador de um deles deve afetar somente esse objeto.

Exemplo

Dois contadores independentes

Considere dois objetos criados a partir de ContadorPontos:

  • contador de Ana — nome: Ana; pontos: 10;
  • contador de Bruno — nome: Bruno; pontos: 25.

Adicionar 5 pontos ao contador de Ana muda seu estado para 15 pontos. O contador de Bruno continua com 25 pontos.

A definição é compartilhada como modelo, mas cada instância representa um contador concreto.

Dica

Pergunta para reconhecer uma classe

Ao avaliar um problema, pergunte: “Existem vários objetos do mesmo tipo, cada um com dados próprios e operações relacionadas?” Se sim, uma classe pode ser uma escolha adequada de modelagem.

Associe os conceitos

Classe, instância, estado ou comportamento?

Associe cada conceito ao elemento correspondente do exemplo ContadorPontos.

Toque em um item e depois no par correspondente.

Passo 2 de 8

Definir a classe e inicializar um objeto

Reconheça a estrutura de uma classe simples, inicialize seus atributos com init e crie uma instância pela chamada da classe.

A estrutura inicial da classe

Classe e inicializador

Uma classe é definida com class, seguida do nome e de dois-pontos. Por convenção, nomes de classes usam CapWords, como ContadorPontos.

Dentro do bloco indentado, __init__ define como cada nova instância começa. Ele é chamado automaticamente quando a classe é usada para criar um objeto. Nesse método, self identifica a instância que está sendo inicializada.

Primeira definição de ContadorPontos

O inicializador recebe um nome e configura a pontuação inicial como zero.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

Dica

Leia a indentação

As linhas de __init__ ficam dentro da classe, e as atribuições ficam dentro do método. A indentação mostra essa estrutura.

Da chamada ao objeto inicializado

Criar uma instância

Para criar um objeto, chamamos a classe como se ela fosse uma função. O argumento "Lia" corresponde ao parâmetro nome. A referência ao objeto produzido pela chamada fica armazenada em jogador.

Durante esse processo, Python chama __init__ automaticamente. Ao final, a instância identificada por self tem nome "Lia" e pontuação 0.

Chamada da classe

Esta linha cria e inicializa uma instância.

python
jogador = ContadorPontos("Lia")

Fluxo da inicialização

A chamada da classe inicia o fluxo; __init__ configura o estado; a expressão fornece o objeto inicializado, cuja referência é guardada na variável.

Diagrama em três etapas: chamada de ContadorPontos com Lia, execução de __init__ e objeto final com nome Lia e zero pontos.

A chamada da classe fornece o objeto; o papel de init é inicializar seu estado.

Atenção

Não retorne o objeto em __init__

__init__ apenas inicializa a instância e termina com retorno implícito None. Não escreva return self nem retorne outro valor. É a chamada da classe — como ContadorPontos("Lia") — que fornece o objeto.

Ordene o fluxo

Da chamada à variável

Coloque os acontecimentos na ordem em que ocorrem em jogador = ContadorPontos("Lia").

  1. A classe ContadorPontos é chamada com o argumento "Lia".
  2. __init__ é executado com a nova instância em self e "Lia" em nome.
  3. A referência ao objeto inicializado é armazenada em jogador.
  4. self.nome recebe "Lia" e self.pontos recebe 0.

Definição e chamada compatíveis

Escolha o par correto

Qual trecho define o inicializador planejado e cria uma instância chamada placar com o nome "Bia" e zero pontos?

Passo 3 de 8

Separar atributos de variáveis locais

Identifique quais valores permanecem associados a uma instância e diferencie atributos de parâmetros e variáveis locais.

O estado fica associado ao objeto

Acesse os atributos pela instância

Os valores atribuídos com self.nome e self.pontos passam a fazer parte do estado do objeto. Depois que a inicialização termina, você pode acessá-los escrevendo a variável que referencia o objeto, um ponto e o nome do atributo: jogador.nome e jogador.pontos.

Inicializar e consultar os atributos

A variável jogador referencia a instância criada. A notação de ponto permite consultar os valores que ficaram associados a ela.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0


jogador = ContadorPontos("Lia")

print(jogador.nome)
print(jogador.pontos)

# Saída:
# Lia
# 0

Local durante a chamada, atributo depois dela

`nome` e `self.nome` têm papéis diferentes

Durante a execução de __init__, nome é um parâmetro local que recebeu o argumento da chamada. Já self.nome é um atributo associado à instância representada por self.

A instrução self.nome = nome lê o valor local que está à direita e o associa ao objeto no atributo que está à esquerda. Quando __init__ termina, o parâmetro local deixa de fazer parte daquela chamada, mas o atributo continua disponível no objeto.

Compare as duas formas de atribuição

Uma variável local existe somente durante a chamada. Usar self. é o que associa o valor à instância.

python
class ContadorPontos:
    def __init__(self, nome):
        apelido_temporario = nome  # variável local
        self.nome = nome           # atributo da instância
        self.pontos = 0             # atributo da instância

Do parâmetro ao estado do objeto

O espaço local existe enquanto __init__ está em execução. Os atributos continuam associados à instância depois que essa execução termina.

Diagrama comparando o espaço local temporário de __init__ com os atributos permanentes nome e pontos da instância.

nome fornece o valor durante a chamada; self.nome mantém esse valor associado ao objeto.

Fixe a diferença

Complete a inicialização

Complete a lacuna para que o nome recebido fique associado ao objeto e possa ser consultado depois com jogador.nome:

class ContadorPontos:
    def __init__(self, nome):
        self._____ = nome
        self.pontos = 0

Passo 4 de 8

Consultar o estado com métodos de instância

Defina um método que consulta a pontuação de uma instância e entenda como self identifica o objeto que recebeu a chamada.

Uma função dentro da classe

Método de instância

Uma função definida no corpo de uma classe é um método. O método consultar_pontos opera sobre uma instância de ContadorPontos e devolve a pontuação armazenada nela.

Por convenção, o primeiro parâmetro de um método de instância se chama self. Esse nome não é uma palavra reservada do Python, mas seguir a convenção torna o código reconhecível.

Definindo consultar_pontos

O método retorna o atributo pontos da instância recebida em self. Ele apenas consulta o estado: nenhum atributo é alterado.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

    def consultar_pontos(self):
        return self.pontos

Quem é self na chamada?

A instância é passada automaticamente

Na chamada jogo.consultar_pontos(), você não escreve um argumento para self. O Python associa automaticamente a instância jogo ao parâmetro self.

Dentro dessa chamada, self.pontos consulta o atributo pontos de jogo. Se a chamada fosse feita por outro objeto, self representaria esse outro objeto.

Da chamada ao atributo consultado

Diagrama em que a chamada jogo.consultar_pontos abre um caminho até o parâmetro self, associado ao objeto jogo, e então até seu atributo pontos com valor zero.

O objeto antes do ponto é a instância representada por self durante a chamada.

Retornar não é exibir

Usando o valor retornado

A chamada produz um resultado que pode ser guardado e depois exibido.

python
jogo = ContadorPontos("Equipe Azul")

resultado = jogo.consultar_pontos()
print(resultado)  # 0

Dica

Responsabilidades separadas

return self.pontos entrega o valor ao código que chamou o método. O print fica fora da classe e decide exibir esse resultado. Assim, o método pode ser usado mesmo quando você não deseja mostrar nada na tela.

Verifique a assinatura e a chamada

Consulta correta

Qual trecho define e chama corretamente um método que devolve a pontuação de jogo?

Passo 5 de 8

Alterar o estado por uma operação

Implemente um método que recebe uma quantidade, atualiza a pontuação da instância e diferencie o efeito da operação de seu valor de retorno.

Um método que modifica a pontuação

Atualize o atributo da instância

O método adicionar_pontos recebe dois parâmetros: self, que identifica a instância, e quantidade, que informa quantos pontos serão adicionados.

A atualização usa a pontuação atual do próprio objeto:

self.pontos = self.pontos + quantidade

Na chamada jogador.adicionar_pontos(7), o objeto jogador é passado automaticamente como self. Portanto, o argumento 7 corresponde a quantidade.

Implementação da operação

Execute este exemplo com Python 3 para observar a alteração da pontuação.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

    def consultar_pontos(self):
        return self.pontos

    def adicionar_pontos(self, quantidade):
        self.pontos = self.pontos + quantidade


jogador = ContadorPontos("Ana")
jogador.adicionar_pontos(7)
print(jogador.consultar_pontos())  # 7

Antes e depois da chamada

A operação parte do estado atual

Considere um contador que já possui 10 pontos. Ao receber a chamada jogador.adicionar_pontos(7), o método consulta o valor atual por self.pontos, soma a quantidade e associa o resultado novamente ao mesmo atributo. Depois da chamada, esse objeto passa a ter 17 pontos.

Transformação do estado

Diagrama em dois quadros mostrando o mesmo objeto com 10 pontos antes da chamada e 17 pontos depois da adição de 7 pontos.

A chamada altera o atributo pontos do objeto que aparece antes do ponto.

Efeito não é o mesmo que retorno

A operação altera; a consulta retorna

Neste exemplo, adicionar_pontos modifica o estado e não possui return explícito. Por isso, o valor produzido pela chamada é None. Isso não significa que a operação falhou: a nova pontuação ficou armazenada no objeto.

Já consultar_pontos usa return para fornecer a pontuação ao código que fez a chamada. Essa é uma escolha adequada para estes dois métodos, mas não uma regra obrigatória para todos os métodos.

Compare retorno e estado

A variável resultado recebe o retorno da operação, não a pontuação atualizada.

python
jogador = ContadorPontos("Ana")

resultado = jogador.adicionar_pontos(5)

print(resultado)                    # None
print(jogador.consultar_pontos())   # 5

Pratique a atualização e a consulta

Complete a atualização

Complete apenas o lado direito da atribuição:

self.pontos = ______

Preveja retorno e estado final

Um contador começa com zero pontos e recebe estas chamadas:

jogador.adicionar_pontos(4)
resultado = jogador.adicionar_pontos(6)

O que fica armazenado em resultado? Qual valor será devolvido depois por jogador.consultar_pontos()? Explique a diferença.

Escreva pelo menos 10 caracteres (0/10).

Passo 6 de 8

Acompanhar duas instâncias

Preveja e confira como chamadas intercaladas alteram separadamente o estado de dois objetos.

Dois objetos, dois estados

A classe é a mesma; os objetos são distintos

Cada chamada de ContadorPontos(...) cria uma nova instância. Neste exemplo, cada objeto mantém seu próprio nome e sua própria pontuação.

Em uma chamada de método, observe o objeto antes do ponto: contador_ana.adicionar_pontos(10) atua sobre contador_ana, não sobre contador_beto.

Chamadas direcionadas

As duas instâncias partem da mesma classe, mas cada seta alcança somente o objeto que recebe a chamada.

Diagrama da classe ContadorPontos ligada a dois objetos distintos, cada um com nome e pontuação próprios, e setas de chamadas direcionadas separadamente a cada objeto.

O objeto antes do ponto determina qual estado será consultado ou alterado.

Rastreie antes de executar

Sequência de chamadas

Leia as instruções na ordem e atualize mentalmente apenas o contador que aparece antes do ponto.

python
contador_ana = ContadorPontos("Ana")
contador_beto = ContadorPontos("Beto")

contador_ana.adicionar_pontos(10)
contador_beto.adicionar_pontos(7)
contador_ana.adicionar_pontos(5)
contador_beto.adicionar_pontos(3)

Tabela de rastreamento

Acompanhe os estados após cada linha:

| Momento | Ana | Beto |
|---|---:|---:|
| Após criar os objetos | 0 | 0 |
| Ana recebe 10 | 10 | 0 |
| Beto recebe 7 | 10 | 7 |
| Ana recebe 5 | 15 | 7 |
| Beto recebe 3 | ? | ? |

Complete o rastreamento

Digite as pontuações finais no formato Ana,Beto, sem espaços.

Compare a previsão com a execução

Execute no seu computador

Copie o script completo para um arquivo Python e execute-o com Python 3. Compare a saída com a previsão feita na tela anterior.

Script completo

O código inclui a classe, as duas instâncias, as chamadas intercaladas e a consulta dos estados finais.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

    def consultar_pontos(self):
        return self.pontos

    def adicionar_pontos(self, quantidade):
        self.pontos += quantidade


contador_ana = ContadorPontos("Ana")
contador_beto = ContadorPontos("Beto")

contador_ana.adicionar_pontos(10)
contador_beto.adicionar_pontos(7)
contador_ana.adicionar_pontos(5)
contador_beto.adicionar_pontos(3)

print(f"{contador_ana.nome}: {contador_ana.consultar_pontos()}")
print(f"{contador_beto.nome}: {contador_beto.consultar_pontos()}")

Exemplo

Saída esperada

Ana: 15
Beto: 10

Explique o resultado

O que você observou?

A execução confirmou sua previsão? Registre as duas pontuações finais e explique por que uma chamada de adicionar_pontos alterou somente o contador escolhido.

Escreva pelo menos 60 caracteres (0/60).

Passo 7 de 8

Reconhecer um atributo inexistente

Leia um AttributeError, identifique o atributo ausente e corrija a inconsistência que provocou a falha.

O que a mensagem revela

Um atributo que não foi encontrado

Neste exemplo, AttributeError indica que o programa tentou acessar um atributo inexistente no objeto. A parte final da mensagem informa duas pistas importantes: o tipo do objeto e o nome do atributo procurado.

Acesso com um nome diferente

A instância possui pontos, mas o método tenta acessar pontuacao.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

    def consultar_pontos(self):
        return self.pontuacao


contador = ContadorPontos("Equipe Azul")
print(contador.consultar_pontos())

# AttributeError: 'ContadorPontos' object has no attribute 'pontuacao'

Anatomia da falha

Diagrama de um objeto ContadorPontos com os atributos nome e pontos, enquanto uma seta tenta alcançar o atributo ausente pontuacao.

O objeto é do tipo ContadorPontos; o acesso falha especificamente porque pontuacao não foi definido nele.

Investigue a origem, não esconda a falha

Duas causas comuns neste exemplo

Primeiro, compare a grafia usada na inicialização com a grafia usada no acesso. Se os nomes deveriam ser iguais, corrija o acesso. Depois, confirme se o valor foi atribuído com self.atributo: uma variável local desaparece ao fim do método e não passa a fazer parte do objeto.

Duas correções possíveis

Cada correção resolve uma inconsistência diferente.

python
# Causa 1: diferença de grafia no acesso
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

    def consultar_pontos(self):
        return self.pontos  # corrigido: era self.pontuacao


# Causa 2: variável local no lugar de atributo
class OutroContador:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0  # corrigido: era apenas pontos = 0

    def consultar_pontos(self):
        return self.pontos

Atenção

Corrija a intenção do código

Não use try e except apenas para ocultar esse erro. Se o atributo deveria existir, alinhe seu nome ou inicialize-o com self.atributo.

Diagnóstico rápido

Encontre a inconsistência

Observe onde a pontuação inicial é definida e onde ela é acessada.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        pontos = 0

    def adicionar_pontos(self, quantidade):
        self.pontos += quantidade


jogador = ContadorPontos("Lia")
jogador.adicionar_pontos(10)

Proponha a correção

Qual é a causa do erro quando jogador.adicionar_pontos(10) é executado? Indique também a linha que deve substituir pontos = 0.

Escreva pelo menos 30 caracteres (0/30).

Passo 8 de 8

Aplicação final: dois contadores em ação

Implemente a classe ContadorPontos, execute uma sequência com duas instâncias e explique como cada objeto mantém sua própria pontuação.

Desafio: implemente a classe completa

Sua tarefa

No seu computador, crie um arquivo Python e implemente ContadorPontos antes do código de uso abaixo.

A classe deve:

  • receber nome em __init__;
  • guardar o nome em self.nome;
  • iniciar self.pontos com 0;
  • ter consultar_pontos(), que retorna a pontuação;
  • ter adicionar_pontos(quantidade), que soma a quantidade ao estado atual sem retorno explícito.

Depois, execute o arquivo com Python 3 e compare o resultado com a referência da próxima tela.

Código de uso

Escreva a definição da classe acima deste trecho. Não altere a sequência de chamadas durante a primeira execução.

python
alice = ContadorPontos("Alice")
bruno = ContadorPontos("Bruno")

print("Pontuações iniciais")
print(f"{alice.nome}: {alice.consultar_pontos()}")
print(f"{bruno.nome}: {bruno.consultar_pontos()}")

alice.adicionar_pontos(10)
bruno.adicionar_pontos(7)
alice.adicionar_pontos(5)

print("Pontuações finais")
print(f"{alice.nome}: {alice.consultar_pontos()}")
print(f"{bruno.nome}: {bruno.consultar_pontos()}")

Compare a execução

Atenção

Consulte depois de tentar

Antes de revelar a solução, tente escrever a classe e executar o programa. Se ocorrer um AttributeError, confira a grafia dos atributos e verifique se eles foram definidos com self.

Saída esperada

As duas instâncias começam com zero. Somente Alice recebe a segunda adição de pontos.

text
Pontuações iniciais
Alice: 0
Bruno: 0
Pontuações finais
Alice: 15
Bruno: 7

Solução completa

Compare esta solução com a sua. Observe que o método de consulta retorna um valor, enquanto o método de alteração apenas atualiza o atributo.

python
class ContadorPontos:
    def __init__(self, nome):
        self.nome = nome
        self.pontos = 0

    def consultar_pontos(self):
        return self.pontos

    def adicionar_pontos(self, quantidade):
        self.pontos = self.pontos + quantidade


alice = ContadorPontos("Alice")
bruno = ContadorPontos("Bruno")

print("Pontuações iniciais")
print(f"{alice.nome}: {alice.consultar_pontos()}")
print(f"{bruno.nome}: {bruno.consultar_pontos()}")

alice.adicionar_pontos(10)
bruno.adicionar_pontos(7)
alice.adicionar_pontos(5)

print("Pontuações finais")
print(f"{alice.nome}: {alice.consultar_pontos()}")
print(f"{bruno.nome}: {bruno.consultar_pontos()}")

Registre o que aconteceu

Explique os estados finais

Quais foram as pontuações finais de Alice e Bruno? Explique como self fez cada chamada atuar sobre o objeto correto.

Escreva pelo menos 80 caracteres (0/80).

Síntese e conclusão

Da classe aos dois estados

A definição da classe reúne a inicialização e os métodos. Cada chamada de ContadorPontos(...) cria um objeto distinto, e as chamadas posteriores consultam ou alteram o estado do objeto que está antes do ponto.

Diagrama de uma definição de classe originando dois objetos separados, cada um com identidade e quantidade própria de pontos, com setas de consulta e alteração direcionadas a cada objeto.

Uma classe orienta a criação; cada instância conserva seu próprio nome e sua própria pontuação.

Resumo

O que você realizou

Você integrou inicialização, atributos e métodos em uma classe simples e acompanhou duas instâncias durante operações intercaladas.

  • A classe define como os objetos são inicializados e quais operações oferecem.
  • __init__ associa nome e pontos a cada nova instância por meio de self.
  • consultar_pontos retorna o estado sem alterá-lo.
  • adicionar_pontos usa o estado atual e atualiza a instância que recebeu a chamada.
  • Duas chamadas da classe produzem objetos distintos, cujas pontuações podem evoluir de forma independente.

Tutorial concluído

Parabéns! Você concluiu: Criar objetos com classes e métodos de instância

Parabéns! Você concluiu o tutorial Criar objetos com classes e métodos de instância.

100 XP

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso