1. Introdução
Python não força o programador a pensar em objetos, mas eles fazem parte da linguagem desde o início, incluindo conceitos avançados como sobrecarga de operadores, herança múltipla e introspecção. Com sua sintaxe simples, é muito natural aprender orientação a objetos em Python, pois existem classes prontas e fáceis de usar para acessar bancos de dados, montar aplicações gráficas, processar XML e realizar inúmeras outras tarefas.
As instruções a seguir foram traduzido de "Estrutura de Dados e Algoritmos com Padrões de Projetos Orientado a Objeto em Python de Bruno R. Preiss" elas identificam e descrevem as características da linguagem de programação Python.
2. Objetos e Tipos de dados
Um objeto em linguagem de programação abstrata representa a posição onde será armazenada. Os objetos em Python apresentam os seguintes atributos:
* Tipo: O tipo de um objeto determina os valores que o objeto pode receber e as operações que podem ser executadas nesse objeto.
* Valor: O valor de um objeto é o índice de memória ocupada por essa variável. Como os índices das posições da memória são interpretados, isto é determinado pelo tipo da variável.
* Tempo de vida: A vida de um objeto é o intervalo de tempo de execução de um programa em Python, é durante este tempo que o objeto existe.
3. Nomes
A fim de utilizar um objeto em um programa em Python, esse objeto deve ter um nome. O nome de um objeto é uma variável usada para identificar esse objeto em um programa. Em Python, um objeto não pode ter zero, um ou mais no nome.
Veja: 1 i = 57
Esta indicação cría um objeto com nome i e liga vários atributos com esse objeto. O tipo do objeto é int e seu valor é 57.
Alguns atributos de um objeto, tal como seu tipo, são limitados quando o objeto é criado e não podem serer mudados. Isto é chamado ligação estática.
As ligações para outros atributos de um objeto, tais como seu valor, podem ser mudados durante a execução do programa onde o objeto está. Isto é chamado de ligação dinâmica.
Veja:
Veja: 1 i = 57
Esta indicação cría um objeto com nome i e liga vários atributos com esse objeto. O tipo do objeto é int e seu valor é 57.
Alguns atributos de um objeto, tal como seu tipo, são limitados quando o objeto é criado e não podem serer mudados. Isto é chamado ligação estática.
As ligações para outros atributos de um objeto, tais como seu valor, podem ser mudados durante a execução do programa onde o objeto está. Isto é chamado de ligação dinâmica.
Veja:
1 i = int(57)
Se nós seguirmos esta indicação com uma indicação de atribuição como:
Se nós seguirmos esta indicação com uma indicação de atribuição como:
1 j = i
então os nomes i e j são o mesmo objeto!
A comparação ficaria:
então os nomes i e j são o mesmo objeto!
A comparação ficaria:
1 if i == j:
2 print "valores iguais"
este é o teste se o valor do objeto i é o mesmo valor do objeto j (desde que sejam de mesmo valor). Entretanto, é possível para dois objetos distintos terem o mesmo valor. Para testar se os dois nomes são um mesmo objeto, é necessário utilizar o operador is:
1 if i is j:
2 print "mesmo objeto"
Para saber se os tipos de dados de dois objetos são iguais é necessário:
1 i = 57
2 j = 47
3 if type(i) == type(j):
4 print "mesmo tipo"
4. Passagem de Parâmetros
A passagem de parâmetro é um método em que os parâmetros são transferidos entre métodos quando um método chama outro. Python fornece somente um método da passagem de parâmetro, passagem-por-referência.
Considere o par de métodos definidos abaixo. Na linha 4, o método um chama o método dois. Em geral, cada chamada do método inclui a lista de argumentos, possivelmente vazio. Os argumentos especificados em uma chamada do método são chamados parâmetros reais. Neste caso, há somente um parâmetro real, o x.
Considere o par de métodos definidos abaixo. Na linha 4, o método um chama o método dois. Em geral, cada chamada do método inclui a lista de argumentos, possivelmente vazio. Os argumentos especificados em uma chamada do método são chamados parâmetros reais. Neste caso, há somente um parâmetro real, o x.
1 def um():
2 x = 1
3 print x
4 dois(x)
5 print x
6
7 def dois(y):
8 print y
9 y = 2
10 print y
Na linha 7 o método dois é definido como um método que aceita um único argumento y. Os argumentos que aparecem na definição do método são chamados parâmetros formais.
A semântica da passagem-por-referência é: O efeito da definição do parâmetro formal deve criar um nome no namespace local da função e ligá-lo então o nome ao objeto pelo parâmetro real. Por exemplo, no método dois o parâmetro formal é y. Quando o método é chamado, o nome y está atribuído ao objeto x.
A saída do método um ficará:
1 1 2 1
E a saída do método dois com o parâmetro 3 ficará:
2 3
A semântica da passagem-por-referência é: O efeito da definição do parâmetro formal deve criar um nome no namespace local da função e ligá-lo então o nome ao objeto pelo parâmetro real. Por exemplo, no método dois o parâmetro formal é y. Quando o método é chamado, o nome y está atribuído ao objeto x.
A saída do método um ficará:
1 1 2 1
E a saída do método dois com o parâmetro 3 ficará:
2 3
5. Classes
Uma classe define uma estrutura de dados que contenha instância de atributos, instância de métodos e classes aninhadas. Em Python a classe de um objeto e o tipo de um objeto são sinônimos. Cada objeto do Python tem uma classe (tipo) que é derivada diretamente ou indiretamente da classe interna do objeto do Python. A classe (tipo) de um objeto determina o que é e como pode ser manipulado. Uma classe encapsula dados, operações e semântica.
A classe é o que faz com que Python seja uma linguagem de programação orientada a objetos. Classe é definida como um agrupamento de valores sua gama de operações. As classes facilitam a modularidade e abstração de complexidade. O usuário de uma classe manipula objetos instanciados dessa classe somente com os métodos fornecidos por essa classe. Frequentemente classes diferentes possuem características comuns. As classes diferentes podem compartilhar valores comuns e podem executar as mesmas operações. Em Python tais relacionamentos são expressados usando derivação e herança.
A classe é o que faz com que Python seja uma linguagem de programação orientada a objetos. Classe é definida como um agrupamento de valores sua gama de operações. As classes facilitam a modularidade e abstração de complexidade. O usuário de uma classe manipula objetos instanciados dessa classe somente com os métodos fornecidos por essa classe. Frequentemente classes diferentes possuem características comuns. As classes diferentes podem compartilhar valores comuns e podem executar as mesmas operações. Em Python tais relacionamentos são expressados usando derivação e herança.
6 Classes Aninhadas
Em Python é possível definir uma classe dentro de outra, chamada de classes aninhadas.
Veja:
1 class A(object):
2
3 def __init__(self):
4 self.y = 0
5
6 class B(object):
7
8 def __init__(self):
9 self.x = 0
10
11 def f(self):
12 pass
Uma classe aninhada comporta-se como qualquer "classe externa" (não-aninhada). Pode conter métodos e atributos, e pode ser instanciada assim:
1 obj = A.B()
Este estado cria uma nova instância da classe B. Instanciado, nós podemos invocar o método f utilizando:
Este estado cria uma nova instância da classe B. Instanciado, nós podemos invocar o método f utilizando:
1 obj.f()
Note, não é necessário instanciar a classe externa A, mesmo quando nós criamos uma instância da classe interna.
Os métodos de uma classe aninhada podem acessar os atributos da classe interna mas não das classes externas, o método f pode acessar o atributo x do exemplo acima, mas não pode acessar o atributo y.
Note, não é necessário instanciar a classe externa A, mesmo quando nós criamos uma instância da classe interna.
Os métodos de uma classe aninhada podem acessar os atributos da classe interna mas não das classes externas, o método f pode acessar o atributo x do exemplo acima, mas não pode acessar o atributo y.
7 Herança e Polimorfismo
7.1 Derivação e Herança
Esta seção revê o conceito de classe derivada. As classes derivadas são uma característica extremamente útil em Python porque permitem que o programador defina classes novas estendendo classes existentes. Usando classes derivadas, o programador pode explorar as comunalidades que existem entre as classes de um programa. As classes diferentes podem compartilhar valores e operações.
A derivação é a definição de uma classe nova estendendo uma classe existente. A classe nova é chamada de classe derivada e a classe existente de quem é derivada é chamada de classe base.
Em Python, deve haver ao menos uma classe base, mas pode haver mais de uma classe base, formando assim herança múltipla.
Python suporta classes clássicas (old-style classes) e classes de novo-estilo (new-style classes). Uma new-style class é uma classe que é derivada da classe interna do objeto. Uma old-style class é uma classe que não tem uma classe base ou uma que é derivada somente de outras classes old-style.
Considere a classe Pessoa e a classe Pais abaixo. Porque Pais também são Pessoas, a classe Pai é derivada da classe Pessoa. A derivação em Python é indicada incluindo o(s) nome(s) da class(es) base em parênteses na declaração da classe derivada.
1 class Pessoa(object):
2 FEMALE = 0
3 MALE = 1
4
5 def __init__(self, nome, sexo):
6 super(Pessoa, self).__init__()
7 self._nome = nome
8 self._sexo = sexo
9
10 def __str__(self):
11 return str(self._nome)
12
13 class Pais(Pessoa):
14
15 def __init__(self, nome, sexo, crianca):
16 super(Pais, self).__init__(nome, sexo)
17 self._crianca = crianca
18
19 def getCrianca(self, i):
20 return self._crianca[i]
21
22 def __str__(self):
23 pass
Uma classe derivada herda todos os atributos de sua classe base. Isto é, a classe derivada contem todos os atributos da classe contidos na classe base e a classe derivada suporta todas as operações fornecidas pela classe base. Por exemplo, veja:
1 p = Pessoa()
2 q = Pais()
Assim p é uma Pessoa, tem os atributos _nome e _sexo e o método str. Além disso, a classe Pais é derivado de Pessoa, então o objeto q também é uma instância de atributos _nome _sexo e do método str.
Uma classe derivada pode estender a classe base de diversas maneiras: Os novos atributos podem ser usados, os novos métodos podem ser definidos e os métodos existentes podem ser sobrescritos. Por exemplo, a classe Pais adiciona uma atributo _crianca e um método getChild.
Se um método for definido em uma classe derivada que tenha o mesmo nome que um método na classe base, o método na classe derivada sobrescreve ele na classe base. Por exemplo, o método str na classe Pais sobrescreve o método str na classe Pessoa. Conseqüentemente, str(p) invoca Pessoa.str , visto que o str(q) invoca Pais.str .
Uma instância de uma classe derivada pode ser usada em qualquer lugar em um programa onde uma instância da classe base possa ser usado. Por exemplo, isto significa que a classe Pais pode ser passado como um parâmetro real a um método que espere receber uma Pessoa.
Uma classe derivada pode estender a classe base de diversas maneiras: Os novos atributos podem ser usados, os novos métodos podem ser definidos e os métodos existentes podem ser sobrescritos. Por exemplo, a classe Pais adiciona uma atributo _crianca e um método getChild.
Se um método for definido em uma classe derivada que tenha o mesmo nome que um método na classe base, o método na classe derivada sobrescreve ele na classe base. Por exemplo, o método str na classe Pais sobrescreve o método str na classe Pessoa. Conseqüentemente, str(p) invoca Pessoa.str , visto que o str(q) invoca Pais.str .
Uma instância de uma classe derivada pode ser usada em qualquer lugar em um programa onde uma instância da classe base possa ser usado. Por exemplo, isto significa que a classe Pais pode ser passado como um parâmetro real a um método que espere receber uma Pessoa.
7.2 Polimorfismo
Polimorfismo significa ter algo único em vários lugares. O polimorfismo é usado em classes distintas compartilhando funções em comum. Porque as classes derivadas são distintas, suas execuções podem diferir. Entretanto, as classes derivadas compartilham de uma relação comum, instâncias daquelas classes são usadas exatamente na mesma maneira.
Traduzido por LeonardoGregianin
(Meterial retirado do endereço web http://www.python.org)
Nenhum comentário:
Postar um comentário