Continuando a nossa série de posts sobre como aprender Python, vamos agora começar a falar de OO com Python. Para quem não viu os outros posts, pode ler o primeiro post aqui e o segundo aqui.

Não, eu não esqueci de continuar postando sobre python, apenas demorei um pouco na seqüência.

Objetos são a unidade fundamental de qualquer sistema orientado a objetos. Orientação a objetos é um termo que descreve uma série de técnicas e soluções para problemas computacionais. No nosso caso específico, vamos falar apenas de programação Orientada a Objetos, que é um paradigma de programação no qual um programa é estruturado em objetos, e que enfatiza abstração, encapsulamento, polimorfismo e herança. Em Python, tudo é um objeto (tipos, valores, classes, funções, métodos e, é claro, instâncias).

Em Python, a estrutura essencial para definir novos objetos é a classe. As classes são definidas em código-fonte, onde recebem um nome identificador e encapsulam um conjunto de atributos (dados) e métodos (operações). Vejamos a estrutura simples de uma classe em Python:


CODE:
  1. class MinhaClasse:
  2.     atributo1 = valor;
  3.     atributo2 = valor;
  4.     def metodo1(self):
  5.         #faz alguma coisa
  6.     def metodo2(self, atributo1):
  7.         #faz alguma coisa

Vejamos uma classe funcional agora:


CODE:
  1. class HelloWorld:
  2.     'Minha Primeira Classe em Python'
  3.     i = 123
  4.     def funcao(self):
  5.         return 'Hello World!!!'

As classes suportam dois tipos distintos de operações, são elas: instanciação e referência a atributos.

A referência a atributos possui uma sintaxe padrão para os objetos de classses em Python: obj.atributo. Sendo obj o seu objeto classe e atributo algum atributo válido, seja ele um atributo (variável) do seu objeto classe ou um objeto função (operação). Usando a classe acima podemos referenciar HelloWorld.i e HelloWorld.funcao, estas referências serão válidas e retornarão um inteiro (123) e um objeto função, respectivamente.

A instanciação do objeto classe é como nas demais linguagens orientadas a objetos, nós vamos basicamente iniciar um objeto de um determinado tipo (o tipo é o objeto classse) e atribuir a algum atributo. A instanciação (calling) de uma classe, por default, cria um objeto vazio. Por exemplo, para instanciarmos nossa classe de exemplo:


CODE:
  1. x = HelloWorld()

Porém, muitas classes podem precisar criar um novo objeto em um estado inicial pré-determinado. Para estes casos, existe um método especial que pode ser definido pela classe, é o método __init__(), conforme próximo exemplo. O método __init__() é o construtor da classe e poderá ter ou não atributos, isso vai depender das necessidades de cada classe.


CODE:
  1. class HelloWorld:
  2.     'Minha Primeira Classe em Python'
  3.     i = 123
  4.     def __init__(self):
  5.         self.i = 123456
  6.     def funcao(self):
  7.         return 'Hello World!!!'

Agora, após esta alteração em nossa classe, caso ocorra uma referência ao atributo i sem que haja uma instanciação da classe, o valor retornado será 123, mas caso a classe tenha sido instanciada, o valor retornado será 123456.


CODE:
  1. print HelloWorld.i
  2. 123
  3. x= HelloWorld()
  4. print x.i
  5. 123456

"- E aquela String perdida ali no começo da classe?", você já se perguntou isso? Aquela String é chamada de docstring e pode ser acessada através do atributo __doc__, que no nosso caso irá retornar a String "Minha Primeira Classe em Python". As docstring podem ser inseridas no início de funções, classes e métodos, é uma convenção criada para documentação. Esta documentação poderá ser consultada depois usando o pydoc com o comando help. Abaixo acesso direto ao atributo __doc__ da classe.


CODE:
  1. print HelloWorld.__doc__
  2. Minha Primeira Classe em Python

Consulta ao help da classe usando o pydoc.


CODE:
  1. help(HelloWorld)
  2. Help on class HelloWorld in module __main__:class HelloWorld
  3.  |  Minha Primeira Classe em Python
  4.  |
  5.  |  Methods defined here:
  6.  |
  7.  |  __init__(self)
  8.  |
  9.  |  funcao(self)
  10.  |
  11.  |  ----------------------------------------------------------------------
  12.  |  Data and other attributes defined here:
  13.  |
  14.  |  i = 123

Nós poderíamos ter definido mais informações de documentação nesta classe, nos métodos __init__() e funcao por exemplo. Se fosse o caso, basta adicionar os comentários entre aspas ('') na primeira linha de cada método.

Herança, herança múltipla, exceções e definições de escopo de atributos e métodos serão abordados no próximo post, já estou achando esse aqui muito longo, esta continuação já está em draft e sairá mais rápido! :D

Guarde e compartilhe: Selecione o seu leitor preferido.
  • del.icio.us
  • Digg
  • Technorati
  • Rec6
  • Slashdot
  • DZone
  • StumbleUpon
  • Reddit
  • Netvouz
  • ThisNext
  • MisterWong
  • Wists
  • Ma.gnolia
  • Netscape
  • NewsVine
  • YahooMyWeb
  • TailRank
  • Furl

Se você for novo por aqui, talvez queira assinar o RSS dos posts do blog aqui. Obrigado pela visita e volte sempre!