Da trilha de Python Este conceito ainda não saiu como card do dia. ir para o card de hoje

Python POO Intermediário

Classes e objetos

Em Python, uma classe é um molde que descreve o que um tipo de objeto tem (atributos) e o que ele faz (métodos). Um objeto (ou instância) é um exemplar concreto criado a partir dessa classe, com seus próprios valores. Por exemplo, a classe ContaBancaria define que toda conta tem titular e saldo, mas cada objeto conta guarda valores diferentes.

O método especial __init__ é o inicializador: ele roda automaticamente quando você cria um objeto e serve para definir os atributos iniciais. O primeiro parâmetro de todo método de instância é self, que representa o próprio objeto e dá acesso aos seus atributos e métodos.

Atributos de instância (definidos com self.nome) pertencem a cada objeto. Atributos de classe (definidos direto no corpo da classe) são compartilhados por todas as instâncias. Entender essa diferença evita bugs clássicos, como alterar um valor que deveria ser individual.

Pontos-chave

  • __init__ é chamado automaticamente ao criar o objeto e inicializa atributos.
  • self é a referência ao objeto atual e deve ser o primeiro parâmetro dos métodos de instância.
  • Atributos de instância (self.x) são individuais; atributos de classe são compartilhados.
  • Métodos são funções definidas dentro da classe que operam sobre self.
  • Criar um objeto é chamar a classe como função: obj = MinhaClasse(args).
contas.py
class ContaBancaria:
    # atributo de classe: compartilhado por todas as contas
    banco = "Banco Python"

    def __init__(self, titular, saldo=0.0):
        # atributos de instância: individuais
        self.titular = titular
        self.saldo = saldo

    def depositar(self, valor):
        if valor <= 0:
            raise ValueError("valor deve ser positivo")
        self.saldo += valor

    def sacar(self, valor):
        if valor > self.saldo:
            raise ValueError("saldo insuficiente")
        self.saldo -= valor

    def extrato(self):
        return f"{self.titular}: R$ {self.saldo:.2f} ({self.banco})"


if __name__ == "__main__":
    c1 = ContaBancaria("Ana", 100.0)
    c2 = ContaBancaria("Bruno")

    c1.depositar(50)
    c1.sacar(30)
    c2.depositar(20)

    print(c1.extrato())
    print(c2.extrato())
    print("Atributo de classe:", ContaBancaria.banco)

Exercícios

  1. 1
    Fácil

    Criando a classe Pessoa

    Crie uma classe Pessoa com __init__ que recebe nome e idade, armazenando-os como atributos de instância. Adicione um método apresentar() que retorna uma string no formato "Meu nome é <nome> e tenho <idade> anos.".

    Resolver
  2. 2
    Médio

    Conta com atributo de classe

    Crie a classe Conta com um atributo de classe total_contas que conta quantas instâncias já foram criadas. Cada conta tem titular e saldo (atributos de instância). Adicione os métodos depositar(valor) e sacar(valor), sendo que sacar deve levantar ValueError("saldo insuficiente") se o valor for maior que o saldo. Imprima o total de contas criadas.

    Resolver
  3. 3
    Desafio

    Carrinho de compras com itens e total

    Implemente duas classes: Produto (com nome e preco) e Carrinho (com uma lista de itens). O carrinho deve ter adicionar(produto, quantidade=1), remover(nome) e total() que soma preco * quantidade de cada item. Guarde os itens como uma lista de tuplas (produto, quantidade). Imprima o total formatado com duas casas decimais.

    Resolver

Continue estudando