quinta-feira, 19 de março de 2009

Herança

Esta semana vou falar sobre mais um tópico relativo a orientação a objetos: herança.

Herança consiste em fazer com que uma classe "herde" os atributos e métodos de uma outra classe, podendo reescrevê-los ou adicionar funcionalidade à estes.

Vamos a um exemplo prático, a partir da classe que especificamos anteriormente:

# coding: utf-8
# mamifero.py

class Mamifero:
    
    def som(self):
        print 'emitir um som'

class Homem(Mamifero):
        
    def som(self):
        print 'Oi!'

class Cachorro(Mamifero):
    
    def som(self):
        print 'Wufff! Wufff!'

class Gato(Mamifero):
    
    def som(self):
        print 'Meawwwww!'

mamifero = Mamifero()
mamifero.som()

animais = [Homem(), Cachorro(), Gato()]

for animal in animais:
    animal.som()
    

No código acima, criamos 3 classes onde estas herdam os atributos da classe "Mamifero". Neste caso estou demonstrando como podemos reescrever os métodos de uma classe para alterar o funcionamento deste numa classe mais específica.

Ao executar o código acima, no "for" mais abaixo no código, percorreremos uma lista de animais, chamando o método "som()" para cada um deles. Como cada animal foi criado a partir de uma classe específica, o método desta classe mais específica é chamado, e não o da classe mais genérica, "Mamifero". Sendo assim, o som emitido será o que nós esperamos.

Estou indo devagar nesta introdução à classes por este ser um tópico que causa muita confusão nos programadores iniciantes, mas que após um certo tempo de prática se mostra um paradigma interessante e fácil de lidar no dia a dia, tornando a abstração de problemas reais em algoritmos mais simples.

domingo, 1 de março de 2009

De Volta Após o Carnaval!

Olá Pessoal!

Pois é, passado o carnaval, estamos de volta! Esta semana vou entrar num tema bastante interessante: orientação a objetos.

Um conceito fundamental de orientação a objetos é o conceito de classes. Uma classe é uma abstração de um modelo, incluindo dados sobre o modelo e ações que podem ser tomadas sobre este modelo.

Um exemplo clássico de classe apresentada nos cursos de programação é a classe Mamífero. Vou utilizá-la aqui também, por ser de simples entendimento.

Vamos pensar um pouco sobre um mamífero... O que os mamíferos tem em comum? Podemos citar a data de nascimento, por exemplo. Este, aliás, é um atributo comum a todos os seres vivos, não somente os mamíferos... ;-)

Então, como definimos uma classe em Python? Não poderia ser mais simples. Vejamos o exemplo abaixo:

# coding: utf-8
# mamifero.py

class Mamifero:
    def __init__(self):
        self.nascimento = '5 de julho de 1981'

mamifero = Mamifero()
print mamifero.nascimento

No código acima, definimos a classe "Mamifero" e criamos um método, que é uma função pertencente à classe, chamado "__init__". Este método é especial, servindo como inicializador. Ou seja, sempre que um objeto da classe "Mamifero" for criado, este método especial será chamado.

Um outro detalhe é a variável "self". Tal variável representa o objeto para o qual o método foi chamado. No caso do método "__init__", o self representa o objeto que está sendo criado naquele momento.

No método "__init__", criamos um atributo para o objeto, indicando a data do nascimento. Para isto, simplesmente atribuimos uma nova propriedade ao objeto "self". A sintaxe da atribuição é bem simples: objeto.atributo = valor. Tal atribuição fará com que o objeto referenciado tenha um novo atributo, ou, caso o objeto já tenha o atributo especificado, atribuirá um novo valor a ele.

Para criar um novo objeto, a sintaxe também é bem simples: novo_objeto = Classe(). E para acessar um atributo do objeto utilizamos a sintaxe: objeto.atributo. Como vocês podem notar, a linguagem Python faz com que a criação e a utilização de classes e objetos seja o mais simples possível. Eu particularmente gosto do paradigma de orientação a objetos, e aconselho sempre utilizar classes em seus programas.

Vou manter este post bem básico mesmo, apenas com esta definição de classes. Na próxima semana vou mostrar um exemplo mais elaborado da utilização destas. Até o próximo post!