Apr 09 2007
Postado por Silveira com as tags programação, Python, Tutorial.
Sobrecarga de operadores é uma maneira muito elegante de implementar uma álgebra simples para suas classes. Por exemplo os números racionais:

Um racional são dois inteiros na forma a/b. a é um inteiro e b é um inteiro diferente de zero.
Uma classe em Python que modela o comportamento dos racionais:
class Racional:
def __init__(self, divisor, dividendo):
self.divisor = divisor
self.dividendo = dividendo
def __str__(self):
return str(self.divisor) + '/' + str(self.dividendo)
Programa 1 - Classe Racional com saída em string da forma a/b
Salvando esse código como Racional.py podemos chama-lo assim:
>>> from Racional import *
>>> a = Racional(1,2)
>>> print a
1/2
O que fizemos foi chamar o modulo Racional, instanciar um Racional com divisor 1 e dividendo 2 e depois mandamos imprimi-la. A string de saída foi “1/2″. Agora um código um pouco mais interessante:
class Racional:
def __init__(self, divisor, dividendo):
self.divisor = divisor
self.dividendo = dividendo
def __str__(self):
return str(self.divisor) + '/' + str(self.dividendo)
def __mul__(self, outro):
divisor = self.divisor*outro.divisor
dividendo = self.dividendo*outro.dividendo
return Racional(divisor, dividendo)
Programa 2 - Classe Racional com sobrecarga do operador *
Um exemplo de uso do programa 2:
>>> from Racional import *
>>> a = Racional(1,2)
>>> b = Racional(3,4)
>>> c = a*b
>>> print c
3/8
O que nós fizemos foi instanciar dois racionais, a é 1/2 e b é 3/4. c é a multiplicação de a com b.
A operação de multiplicação de racionais foi feita da seguinte forma:

Quando definimos o método __mul__() estamos fazendo a sobrecarga do operador *. O método __mul__ sempre vai exigir dois parâmetros, o self que é o próprio objeto que está à esquerda do operador e outro objeto que eu chamei de outro, ele vai estar à direita do operador *.
É importante notar que um método de sobrecarga pede para que você retorne uma nova instância da classe Racional. Essa nova instância é o objeto que representa a multiplicação dos dois objetos anteriores, no caso, a e b.
Talvez você ainda não tenha se dado conta da beleza desse pequeno código. Num código em C ou Pascal (ou até mesmo em C++ ou Java quando não bem escrito) o mesmo código provavelmente seria assim:
a = Racional(1,2)
b = Racional(3,4)
c = a.soma(b)
ou coisa pior como funções somaRacionais(). No nosso código toma a semântica do operador * ficou encapsulada dentro da classe. Isso é lindo.
Vamos fazer mais uma sobrecarga, a do operador +:
class Racional:
def __init__(self, divisor, dividendo):
self.divisor = divisor
self.dividendo = dividendo
def __str__(self):
return str(self.divisor) + '/' + str(self.dividendo)
def __mul__(self, outro):
divisor = self.divisor*outro.divisor
dividendo = self.dividendo*outro.dividendo
return Racional(divisor, dividendo)
def __add__(self, outro):
divisor = self.divisor * outro.dividendo + outro.divisor * self.dividendo
dividendo = self.dividendo * outro.dividendo
return Racional(divisor, dividendo)
Programa 3 - Agora com o operador +
Podemos usar esse código assim:
>>> from Racional import *
>>> a = Racional(1,2)
>>> b = Racional(3,4)
>>> c = a+b
>>> print c
10/8
O que fizemos foi instanciar os mesmos a e b de antes mas agora c foi criado somando a e b. A operação foi efetuada assim:

Para fazer a sobrecarga do + usamos o método __add__ que recebeu dois parâmetros, o objeto self (ele mesmo) e o objeto outro.
Pronto, acho que agora você já sabe como fazer sobre carga de operadores. Alguns métodos que você pode sobrecarregar:
Existem muitos, muitos outros métodos que você pode sobrecarregar. Esses foram aí de cima são só alguns dos métodos numéricos.
Promoção! Livros de Como Programar em Python pelos menores preços você encontra no Buscapé.
@cmilfont Post de como acessar o Twitter com JavaFX.Falei com ele, ele linkou.
Favorited a video: Israel Soldier _Palestine Girl
40 mortos em ataque de Israel a escola da Nações Unidas http://tinyurl.com/9jnpbp
@andersonvom boa idéia, vou tentar isso.
@ecmansur pior é que não é atraso, essa lentidão estava prevista, desde que eu mandei, por conta de um recesso que eles fizeram. =/
@Eightbits e tem cinco dias que eu mandei um Sedex daqui pra Brasília. O DealExtreme envia mais rápido e de graça. Ô_Ô
Filosofada que deram aqui agora "Ex namorada é que nem Mac Donalds, a gente sabe que faz mal mas come."
11 comentários
lucas;
April 9, 2007 em 12:15 pm
ótimo post
Tiago Albineli Motta
April 9, 2007 em 2:18 pm
Muito bonito
dá pra fazer loucuras perigosas com isso!
Leo Camargo
April 9, 2007 em 4:31 pm
Ah tá.
Ainda bem que resolvi deixar essa vida.
Mas ainda admiro muito esses malucos. =)
Luiz Geron
April 9, 2007 em 4:50 pm
Linkei no wiki do pythonbrasil, edite caso ache necessário.
http://www.pythonbrasil.com.br/moin.cgi/ProgramacaoOrientadaObjetoPython#head-4ba43fbccd23b47faaf7909c8c13ed62a5ec4d9e
Silveira
April 9, 2007 em 7:31 pm
Valeu Luiz, eu tenho usuário lá mas não consegui editar.
Valeu.
Rodrigo
April 10, 2007 em 9:04 am
bacana! eu vi uns truques parecidos no diving into python!
realmente programar em python é muito bom! da pra implementar as melhores técnicas de programação com ele!
abraços!
Silveira
April 10, 2007 em 10:43 am
Rodrigo, ainda não li o Diving into Python.
Bem que eu estou querendo ler um livro mais completo sobre Python. Ele é bom mesmo?
fenrrir
April 10, 2007 em 3:30 pm
Ótimo post, apesar de ser algo simples de se fazer, você não encontra estas informações em qualquer lugar. Uma boa leitura pra qualquer iniciante na linguagem.
Sobrecarga de operadores em Python « Padoca Virtual
April 10, 2007 em 5:02 pm
[...] Link: Eu Podia Ta Matando » Blog Archive » Sobrecarga de operadores em Python [...]
Érick
January 10, 2008 em 11:39 pm
Aew Silveira, você me fez interessar por Python, ainda sei pouquíssima coisa sobre programação, mas vamos tentar aprender né…
E ainda o post sobre a SpeedCrunch me fez voltar a usar o Ubuntu :d
Uma dúvida…
Conheço o seu blog a poucas semanas e estou lendo todos os posts, em alguns eu tenho comentado, como eu faço para saber se teve alguma resposta em algum deles?? (Não sei se tem jeito de EU saber disso, mas não custa nada perguntar né!?:) )
Silveira
January 11, 2008 em 2:14 am
Érick, há maneiras de se fazer isso sim mas eu vou ficar te devendo. Há o feed dos comentários mas eu não tô achando o link pra ele. Eu vou instalar um pluggin que permite ao comentador receber emails das respostas no blog. Eu ainda não tinha instalado porque eu achava que não havia interesse nele. Obrigado.
RSS feed para os comentários desse post · TrackBack URI
Poste seu comentário