Métodos especiais em Python

Python é uma linguagem dinâmica e as vezes nos deparamos com alguns comportamentos que parecem estranhos a primeira vista, como por exemplo a biblioteca pathlib que utiliza um operador de divisão para concatenar um caminho:

from pathlib import Path
path = Path('/home')
file = path / 'arquivo.csv'

Olhando o exemplo acima surge a dúvida:

Como assim estamos dividindo um objeto do tipo pathlib.Path por um objeto do tipo str?

A resposta é simples: Implementando o método especial __div__.

Em Python os operadores, assim como parte das palavras reservadas e funções nativas da linguagem funcionam executando os métodos especiais dos objetos participantes daquela expressão, seguindo o exemplo acima, o que o interpretador Python quando encontra o operador de divisão é chamar:

file = path.__div__('arquivo.csv')

Sabendo disso e conhecendo os métodos especiais nossas possibilidades são diversas, por exemplo, podemos implementar um carrinho de compras com os métodos __add__ e __sub__:

class Item():
    def __init__(self, produto):
        self.produto = produto
        selof.quantidade = 1

    def __repr__(self):
        return '<Item quantidade={}, produto={}'.format(self.quantidade, self.produto)


class Carrinho():
    def __init__(self):
        self.itens = {}

    def __add__(self, produto):
        if produto in self.itens.keys():
            self.itens[produto].quantidade += 1
        else:
            self.itens[produto] = Item(produto)
        return self

    def __sub__(self, produto):
        if produto in self.itens.keys():
            self.itens[produto].quantidade -= 1
        if not self.itens[produto].quantidade:
            del(self.itens[produto])
        return self


carrinho = Carrinho()
# adicionando itens
carrinho += 'xampu'
carrinho += 'sabonete'
carrinho += 'sabonete'
print(carrinho.itens)

#removendo itens
carrinho -= 'xampu'
carrinho -= 'sabonete'
print(carrinho.itens)

 Para aprender mais sobre o funcionamento dos métodos especiais em suas classes veja a seção https://docs.python.org/3/reference/datamodel.html#basic-customization