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âmetrosself— representa o próprio objeto sendo criado (veremos mais sobre isso a seguir)self.nome = nome— cria o atributonomeno 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
classcria 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
selfrepresenta 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 = valordentro do__init__e acessados comobjeto.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.