kb.erickguedes.com
Python: De Noob a Hero

Programação Orientada a Objetos

Aula 5 de 10

Classes e Objetos

class Usuario:
    def __init__(self, nome, email):
        self.nome = nome
        self.email = email
        self.logado = False

    def login(self):
        self.logado = True
        return f"{self.nome} logou"

    def logout(self):
        self.logado = False

    def __str__(self):
        return f"<Usuario: {self.nome}>"

# Uso
user = Usuario("João", "[email protected]")
print(user.login())          # João logou
print(user)                  # <Usuario: João>

Herança

class Animal:
    def __init__(self, nome):
        self.nome = nome

    def som(self):
        raise NotImplementedError

class Cachorro(Animal):
    def som(self):
        return "Au au!"

class Gato(Animal):
    def som(self):
        return "Miau!"

# Polimorfismo
animais = [Cachorro("Rex"), Gato("Mimi")]
for animal in animais:
    print(f"{animal.nome} faz {animal.som()}")

Propriedades

class Conta:
    def __init__(self, saldo=0):
        self._saldo = saldo     # privado por convenção

    @property
    def saldo(self):
        """Getter: retorna saldo formatado."""
        return f"R$ {self._saldo:,.2f}"

    @saldo.setter
    def saldo(self, valor):
        if valor < 0:
            raise ValueError("Saldo não pode ser negativo")
        self._saldo = valor

    @saldo.deleter
    def saldo(self):
        raise PermissionError("Não é permitido deletar saldo")

conta = Conta(1000)
print(conta.saldo)      # R$ 1.000,00
conta.saldo = 2000      # usa setter

Métodos de Classe e Estáticos

class Config:
    ambiente = "desenvolvimento"

    @classmethod
    def from_env(cls):
        """Cria instância a partir de variável de ambiente."""
        return cls()

    @staticmethod
    def validar_email(email):
        """Valida formato de email (não precisa de self)."""
        return "@" in email and "." in email

    @classmethod
    def mudar_ambiente(cls, novo):
        cls.ambiente = novo

Dunder Methods

class Ponto:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __repr__(self):           # representação
        return f"Ponto({self.x}, {self.y})"

    def __eq__(self, outro):      # ==
        return self.x == outro.x and self.y == outro.y

    def __add__(self, outro):     # +
        return Ponto(self.x + outro.x, self.y + outro.y)

    def __len__(self):
        return abs(self.x - 0) + abs(self.y - 0)

p1 = Ponto(1, 2)
p2 = Ponto(1, 2)
print(p1 == p2)     # True (sem __eq__, seria False)
print(p1 + p2)      # Ponto(2, 4)

POO em Python é elegante e flexível. Use @property para encapsulamento, @classmethod para factory methods, e slots para otimização de memória.