Métodos Especiais
__str__, __repr__, __len__ e operadores
Métodos dunder (double underscore, também chamados de métodos mágicos ou especiais) permitem que suas classes se integrem ao comportamento nativo do Python. Com eles, seus objetos podem ser comparados, ordenados, impressos, adicionados e muito mais.
__str__ define a representação legível para humanos (usada por print() e str()). __repr__ define a representação técnica para desenvolvedores (usada pelo REPL). __len__ permite usar len(). __eq__, __lt__ etc. permitem comparações. __add__, __mul__ etc. implementam operadores aritméticos.
__iter__ e __next__ tornam o objeto iterável, permitindo uso em for loops. __contains__ implementa o operador in.
class Vetor:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Vetor({self.x}, {self.y})"
def __repr__(self):
return f"Vetor(x={self.x!r}, y={self.y!r})"
def __add__(self, outro):
return Vetor(self.x + outro.x, self.y + outro.y)
def __mul__(self, escalar):
return Vetor(self.x * escalar, self.y * escalar)
def __eq__(self, outro):
return self.x == outro.x and self.y == outro.y
def __len__(self):
return 2 # dimensão do vetor
def __abs__(self):
return (self.x**2 + self.y**2) ** 0.5
v1 = Vetor(1, 2)
v2 = Vetor(3, 4)
print(v1 + v2) # Vetor(4, 6)
print(v1 * 3) # Vetor(3, 6)
print(abs(v2)) # 5.0
print(len(v1)) # 2
print(v1 == Vetor(1, 2)) # True
# Context manager com dunders
class Temporizador:
def __enter__(self):
import time
self.inicio = time.time()
return self
def __exit__(self, *args):
import time
self.duracao = time.time() - self.inicio__repr__ deve retornar uma string que, ao ser avaliada, recrie o objeto — use para debugging. __str__ é para o usuário final.