Nesta aula você vai aprender:

  • O que são métodos especiais (também chamados de dunder methods)
  • Como usar __str__, __len__, __add__ e outros
  • Como proteger atributos usando encapsulamento
  • Como criar getters e setters em Python
  • Como deixar suas classes mais limpas, seguras e profissionais

Vamos subir mais um nível!

Métodos Especiais (Dunder Methods)

Dunder = “Double UNDERscore” (dois underscores antes e depois)

Exemplos:

__init__
__str__
__len__
__add__
__repr__

Esses métodos não são chamados por você diretamente.
Eles são usados pelo Python para dar comportamento especial aos seus objetos.

__str__ — Controlando como o objeto aparece ao imprimir

Sem __str__, imprimir um objeto fica estranho:

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

p = Pessoa("João", 25)
print(p)

Saída:

<__main__.Pessoa object at 0x000001237AA>

Nada amigável, né?

Agora com __str__:

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

    def __str__(self):
        return f"{self.nome}, {self.idade} anos"

Agora:

print(p)  

Saída:

João, 25 anos

Muito mais profissional!

__len__ — Definindo o tamanho de um objeto

Exemplo: criar uma classe Playlist.

class Playlist:
    def __init__(self, nome, musicas):
        self.nome = nome
        self.musicas = musicas

    def __len__(self):
        return len(self.musicas)

Uso:

p = Playlist("Workout", ["Song A", "Song B", "Song C"])
print(len(p))    # 3

__add__ — Somando objetos

Você pode até definir como “somar” dois objetos faz sentido.

Exemplo com contas bancárias:

class Conta:
    def __init__(self, titular, saldo):
        self.titular = titular
        self.saldo = saldo

    def __add__(self, outra_conta):
        return self.saldo + outra_conta.saldo

Uso:

c1 = Conta("João", 500)
c2 = Conta("Maria", 800)

print(c1 + c2)   # 1300

__repr__ — Representação oficial do objeto

__str__ → para humanos
__repr__ → para desenvolvedores

Exemplo:

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

    def __str__(self):
        return f"{self.nome}, {self.idade}"

    def __repr__(self):
        return f"Pessoa('{self.nome}', {self.idade})"

Agora:

p = Pessoa("João", 25)
print(repr(p))

Saída:

Pessoa('João', 25)

🟦 Exercício 1

Crie uma classe Livro com:

  • título
  • autor
  • número de páginas

Use __len__ para retornar o número de páginas.


🟩 Exercício 2

Crie uma classe Pessoa com:

  • nome
  • idade

E implemente __str__ e __repr__.


🟨 Exercício 3

Crie uma classe Matematica que permita somar dois objetos:

m1 = Matematica(10) 
m2 = Matematica(5) 
print(m1 + m2) # 15