19 de ago. de 2012

Python - Classes

- Programação orientada a objetos:
    É uma disciplina da programação que busca unificar a idéia de algoritmos (sequências de instruções) e estrutura de dados através do conceito de Objeto (unidade de software que encapsula os algoritmos e os dados que ele atua).
     Alguns conceitos importantes da OOP:
- Poliformismo: permite que dois objetos diferentes possam ser usados de maneira parecida. 
- Abstração ou Encapsulamento: é o que permite que um objeto seja utilizado sabendo apenas sua interface, não sendo necessário saber sobre a implementação dos métodos.
- Herança: é o que permite construir objetos que são as especializações de outros objetos. 

- Objetos em Python:
     
       A linguagem Python suporta orientação à objetos através de classes.
    - Classes: pode ser definida como uma fábrica de objetos, todos com as mesmas características. 
    - Instâncias: concretização de uma classe. 
      As principais entidades da oop do python são as classes e as instâncias da classe. Observe a figura ao lado. A fabrica representa as classes e os ursinhos as instâncias das suas respectivas classes. Os atributos das classes são as estruturas particulares de cada instância como a cor ou pata.


     - Declaração de uma classe:
        Para criar uma classe é usado a seguinte sintaxe:
    class nome:
        var valor
        ...
        var valor
        def método (self, arg1, arg2, ...)
        ...
    * as classes sempre tem o self como primeiro argumento. 
    * self = se refere a uma instância da classe.

    Exemplo 01:

    
    
    >> 2
    >> 5
    >> 11

    - Atributos das instâncias:
         No exemplo 01, as variáveis a e b são atributos da classe matematica, portanto pode ser usadas por qualquer instância matematica.
        Um atributo attr associado a uma instância objeto é representado por objeto.attr.
    Para usar o atributo attr de um objeto dentro de um método, é utilizado o self.attr

    - Atributos herdados de classes:
         Se uma classe define o atributo de classe, uma instância recebe o atributo de classe como um atributo de instância.

    Exemplo 02:

    >> 15
    >> 33

    - Construtores:
         No exemplo acima, o método init é usado para iniciar o atributo da instância. Ele é chamado de construtor da classe.
    Para chamar um construtor automaticamente na criação de instâncias é utilizado o método: __init__
         O método __init__ é um "método mágico" invocado de maneira não padronizada.

    Exemplo 03:
    >> Kitty: Miau!
    >> Tibby: Au! Au!

    - Especialização de classes:
         Para fazer com que a classe B herde a A, é usado a seguinte sintaxe: B(A), onde B é a sub-classe de A e A é a super-classe de B.
         Para especializar a classe B basta adicionar novos atributos (variáveis e métodos) ou alterar os métodos.
         Para invocar um método x de A na classe B, basta declarar A.x

    Exemplo 04:

    >> 20
    >> 225
    >> 101

    - Construtores de classes derivadas:
         O construtor de uma classe B derivada de A, precisa chamar o contrutor da classe A. Ele permite inicializar elementos da classe A que não tem na classe B. Sintaxe: A.__init__(self, arg1, ...)

    - Herança Múltipla:
         Uma classe D pode herdar outras classes como A, B, C, etc, onde a classe derivada herda todos os atributos das outras classe-base. Se as duas classes tiverem um atributo com o mesmo nome, a classe herdada primeira prevalece.
    Sintaxe: class D(A, B, C):

    Exemplo 05:

    >> total = 26

    - Atributos privados:
          É possível restringir o acesso aos atributos de uma instância, que é indicado por dois underlines __ . Ex: __x

    - Métodos para reescrever classes:
          É possível reescrever as classes através dos métodos:
    __init__(self, args, ...) # construtor
    chamada: obj nomeclasse(args)
    __del__(self) # deleta um objeto
    chamada: dell obj
    __repr__(self) # chamado quando um objeto é impresso
    chamada: repr(obj)
    __str__(self) # representação impressa da string
    chamada: str(obj)
    __cmp__(self, x) # comparação de objetos
    chamada: cmp(obj, x)

    Exemplo 06:
    
    
    >> Vetor (11, 8)

    - Protocolos:
          É uma especificação de poliformismo informal. Por exemplo strings, listas e tuplas possuem em comum o fato de poderem interagir com vários elementos.
    __len__(self) # retorna o comprimento da sequência
    chamada:  len(obj)
    __getitem__(self, key) # retorna um elemento na posição key
    chamada: objeto[key]
    __setitem__(self, key, value) # apenas para sequências mutáveis
    chamada: obj[key]=value
    __del__(self, key) # apenas para algumas sequências mutáveis
    chamada: del obj[key]

         É isso ai!!! O artigo ficou um pouco grande pois fui escrevendo enquanto estava estudando e minha intenção foi colocar todos os tópicos para ficar completo. Espero ter ajudado!!! ;P

    * Fontes:
    en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
    http://www.tutorialspoint.com/python/python_classes_objects.htm
    Python - Classes - Cláudio Esperança
    Core Python Programming 2nd Edition - Weley J. Chun

    0 comentários:

    Postar um comentário