Criando classes

Aprenda a criar moldes para gerar objetos em Python.

Na lição anterior, você entendeu o conceito de objetos e aprendeu que uma classe é o molde usado para criá-los. Agora chegou a hora de colocar a mão na massa: vamos aprender a criar nossas próprias classes em Python.

A palavra-chave class

Para criar uma classe em Python, usamos a palavra-chave class, seguida do nome da classe e dois-pontos. Por convenção, nomes de classes começam com letra maiúscula:

class Cachorro:
   pass

O pass é usado quando você quer criar uma estrutura vazia, apenas para que o Python não reclame de um bloco sem conteúdo. Por enquanto, nossa classe existe mas não faz nada. Sem o pass, o Python lançaria um IndentationError, pois espera ao menos um comando dentro do bloco da classe.

O método init: preparando o objeto ao nascer

Quando um objeto é criado a partir de uma classe, o Python chama automaticamente um método especial chamado __init__ (pronuncia-se "dunder init", de double underscore init). É nesse método que você define quais atributos o objeto terá quando for criado.

Pense no __init__ como a ficha de cadastro que precisa ser preenchida toda vez que um novo objeto nasce:

class Cachorro:
   def __init__(self, nome, raca, idade):
       self.nome = nome
       self.raca = raca
       self.idade = idade

Vamos entender cada parte:

  • def __init__(self, nome, raca, idade): — define o método de inicialização com três parâmetros
  • self — representa o próprio objeto sendo criado (veremos mais sobre isso a seguir)
  • self.nome = nome — cria o atributo nome no objeto e guarda o valor recebido

O que é o self?

O self é uma referência ao próprio objeto. Quando você escreve self.nome = nome, está dizendo: "guarde o valor de nome como um atributo deste objeto específico".

Imagine que você está criando dois cachorros. O self garante que os atributos de um não se misturem com os do outro:

class Cachorro:
   def __init__(self, nome, raca, idade):
       self.nome = nome
       self.raca = raca
       self.idade = idade

rex = Cachorro("Rex", "Labrador", 3)
milo = Cachorro("Milo", "Poodle", 5)

print(rex.nome)   # Rex
print(milo.nome)  # Milo

Cada objeto carrega seus próprios valores nos atributos, independentemente um do outro.

O nome self é uma convenção obrigatória na prática. Tecnicamente você poderia usar qualquer nome, mas nunca faça isso — toda a comunidade Python espera ver self, e ferramentas como e editores de código assumem que você o usará.

Acessando atributos

Depois de criar um objeto, você acessa seus atributos usando o ponto:

class Cachorro:
   def __init__(self, nome, raca, idade):
       self.nome = nome
       self.raca = raca
       self.idade = idade

rex = Cachorro("Rex", "Labrador", 3)

print(rex.nome)  # Rex
print(rex.raca)  # Labrador
print(rex.idade)  # 3

Você também pode alterar o valor de um atributo depois que o objeto foi criado:

rex.idade = 4  # Rex fez aniversário!
print(rex.idade)  # 4

Adicionando métodos à classe

Além dos atributos (dados), uma classe pode ter métodos (ações). Métodos são funções definidas dentro da classe — e o primeiro parâmetro delas é sempre o self:

class Cachorro:
   def __init__(self, nome, raca, idade):
       self.nome = nome
       self.raca = raca
       self.idade = idade

   def latir(self):
       print(f"{self.nome} diz: Au au!")

   def apresentar(self):
       print(f"Olá! Eu sou {self.nome}, um {self.raca} de {self.idade} anos.")

rex = Cachorro("Rex", "Labrador", 3)
rex.latir()       # Rex diz: Au au!
rex.apresentar()  # Olá! Eu sou Rex, um Labrador de 3 anos.

Dentro dos métodos, usamos self.nome, self.raca etc. para acessar os atributos do próprio objeto.

Métodos que recebem parâmetros

Métodos também podem receber parâmetros além do self:

class Cachorro:
   def __init__(self, nome, raca, idade):
       self.nome = nome
       self.raca = raca
       self.idade = idade

   def comer(self, alimento):
       print(f"{self.nome} está comendo {alimento}. Nhom nhom!")

   def fazer_aniversario(self):
       self.idade += 1
       print(f"Parabéns, {self.nome}! Agora você tem {self.idade} anos.")

rex = Cachorro("Rex", "Labrador", 3)
rex.comer("ração")  # Rex está comendo ração. Nhom nhom!
rex.fazer_aniversario()  # Parabéns, Rex! Agora você tem 4 anos.
print(rex.idade)  # 4

Veja que fazer_aniversario() modifica o atributo self.idade diretamente — o estado do objeto muda após a chamada do método.

Criando vários objetos a partir da mesma classe

A grande vantagem de uma classe é poder criar múltiplos objetos com a mesma estrutura, cada um com seus próprios valores.

Para fixar bem a ideia, vamos ver outro exemplo com um contexto diferente:

class Produto:
   def __init__(self, nome, preco, estoque):
       self.nome = nome
       self.preco = preco
       self.estoque = estoque

   def descricao(self):
       print(f"{self.nome} — R$ {self.preco:.2f} ({self.estoque} unidades)")

   def aplicar_desconto(self, percentual):
       desconto = self.preco * (percentual / 100)
       self.preco -= desconto
       print(f"Desconto de {percentual}% aplicado! Novo preço: R$ {self.preco:.2f}")

# Criando vários produtos a partir do mesmo molde
arroz = Produto("Arroz 5kg", 28.90, 150)
feijao = Produto("Feijão 1kg", 9.50, 80)
azeite = Produto("Azeite 500ml", 24.00, 40)

arroz.descricao()  # Arroz 5kg — R$ 28.90 (150 unidades)
feijao.descricao()  # Feijão 1kg — R$ 9.50 (80 unidades)
azeite.descricao()  # Azeite 500ml — R$ 24.00 (40 unidades)

arroz.aplicar_desconto(10)  # Desconto de 10% aplicado! Novo preço: R$ 26.01
arroz.descricao()  # Arroz 5kg — R$ 26.01 (150 unidades)

Cada produto é um objeto independente com seus próprios valores de nome, preço e estoque.

O que aprendemos nesta lição

Nesta lição, você aprendeu que:

  • A palavra-chave class cria uma classe em Python. Por convenção, nomes de classes começam com letra maiúscula.
  • O método __init__ é chamado automaticamente quando um objeto é criado — é nele que definimos os atributos iniciais do objeto.
  • O parâmetro self representa o próprio objeto e deve ser o primeiro parâmetro de todos os métodos da classe.
  • Atributos são criados com self.nome_do_atributo = valor dentro do __init__ e acessados com objeto.atributo.
  • Métodos são funções definidas dentro da classe — eles podem ler e modificar os atributos do objeto usando self.
  • A partir de uma única classe, você pode criar múltiplos objetos independentes, cada um com seus próprios valores.