9 de fev de 2010

Polimorfismo e o Python

Boa noite pessoal. Peço desculpas por esses dias sem postar, tive alguns problemas, infelizmente.

Bom, a partir de hoje irei abordar a OOP(Object-Oriented Programming) do Python.

Polimorfismo consiste em classes mais abstratas que representam o comportamento das classes concretas que referenciam. Um exemplo em Java:

public abstract class OperacaoMatematica {
   public abstract double calcular(double x, double y);
}
public class Soma extends OperacaoMatematica {
   public double calcular(double x, double y) {
      return x+y;
   }
}
 
public class Subtracao extends OperacaoMatematica {
   public double calcular(double x, double y) {
      return x-y;
   }
}
public class Contas {
   public static void mostrarCalculo(OperacaoMatematica operacao, double x, double y) {
       System.out.println("O resultado é: " + operacao.calcular(x, y));
   }
 
   public static void main(String args[]) {
        //Primeiro calculamos uma soma
        Contas.mostrarCalculo(new Soma(), 5, 5); //Imprime o resultado é: 10
        //Depois uma subtração
        Contas.mostrarCalculo(new Subtracao(), 5, 5); //Imprime o resultado é: 0
   }
}

Como podem ver, existe duas implementações do metodo calcular e uma classe que as encara de forma abstrata. Na classe “Contas” o metodo “mostrarCalculo” recebe como parâmetro um objeto da classe “OperacaoMatematica”. "Nossa! Mas espera aí! Não se instância classes abstratas". É verdade, mas aí que está o trunfo, veja que as classes que implementam o método “calcular” extendem a classe abstrata. Com isso, é possível que “um objeto do tipo OperacaoMatematica seja criado” a partir da classe Subtracao/Soma. Acho que podemos dizer que, o método calcular pode se transformar de acordo com o contexto.

No Python a grande sacada é o tipo do dado, graças a tipagem dinâmica. Polimorfismo no Python rola a solta, pense bem quantas funções admitem diversos tipos de dados diferentes. Vou dar um exemplo aqui:

#Metodo extraido do livro Learning Python
def intersect(seq1, seq2):

     res = []

     for x in seq1:

         if x in seq2:

             res.append(x)

     return res


Isso mesmo, só isso. Sem aquela porrada de classes: classe abstrata, duas classes para implementar o método e, finalmente, uma classe para usar essa abstração. No Python, como dito antes, a abstração é feita no tipo de dado. Teste essa classe passando diversas coisas, por exemplo, strings, tuples, list e etc. Vou colocar alguns exemplos de chamadas e retorno:

>>> intersect("SPAM", "SCAM")

['S', 'A', 'M']

>>> intersect([1,6,3,9], (1,4,5,9))

[1, 9]


Se você ainda não sabia como o polimorfismo funcionava, com certeza agora você pode confirmar um boato que tem por aí. Dizem que o entendimento do polimorfismo através do Python é mais rápido. Bom, comigo foi assim =].

Espero que tenham gostado do post, espero por comentários/dúvidas/sugestões enfim.

Abraços!!!

Nenhum comentário:

Postar um comentário