Orientação a Objeto com Python – Parte 1

Bom dia, Pessoal. Eu sempre desenvolvi em .Net e Java e nestas linguagens meio que obtive um certo “modelo” de como são tratadas os aspectos de orientação a objeto, pois nas duas o tratamento é bem parecido (não é igual) e o conceito de OO para ambas são bem reforçados. O Python, por outro lado, tem uma forma bem peculiar de tratar estes aspectos, o que pode causar um pouco de estranheza em quem está vindo do java ou .net por exemplo. Vamos as diferenças: No Java

package testes;

public class Veiculo {
	
	private String marca;
	private String cor;
	
	public Veiculo(String pMarca)
	{
		   this.setMarca(pMarca);
	}

	public String getMarca() 
	{
		return marca;
	}

	public void setMarca(String pMarca) 
	{
		this.marca = pMarca;
	}
	
	public void mudaCor(String pNovaCor)
	{
		this.cor = pNovaCor;
	}
}

Esta mesma classe em Python:

class Veiculo(object):
  
   def __init__(self, pMarca):
       self.marca = pMarca
       self.cor   = ""

   def muda_cor(self, pNovaCor):
       self.cor = pNovaCor

Vamos a algumas explicações e experiências que tive falando e trabalhando com outros programadores. Python não é Java logo não é necessário (Salvo poucas exceções) definir setter e getter, mas é possível faze-lo. Os atributos do objeto podem ser acessado diretamente, isto poupa tempo e processamento.

Porque foi definido “Veiculo(object)”?

Esta é a forma de dizer que a classe Veiculo descende da classe Objeto. Vamos supor que possua a classe Carro e fosse filho da classe Veiculo, logo sua declaração seria “Carro(Veiculo)”. Tudo em Python é um objeto e descende da class object.

O que é o “__init__(self, pMarca)”?

Esta é a forma de declaração do método de instância. Neste caso, esta forçando a dizer qual é a marca do veiculo no momento de instanciar o novo objeto.

O que é este “self” nos métodos?

É a forma que se está dizendo como você irá realizar o processo no objeto, por exemplo mudar a cor do Veiculo. Significa o veiculo está mudando a própria cor. Pode ser utilizado desta forma também:

uno = Veiculo("Fiat") #Jaba to ganhando uma grana nesta propaganda! Valeu Fiat!
uno.muda_cor("azul");

print "MARCA: %s COR: %s" % (uno.marca, uno.cor)

#ou assim

uno = Veiculo("Fiat")
Veiculo.muda_cor(uno, "azul")

print "MARCA: %s COR: %s" % (uno.marca, uno.cor)

Acesso as variaveis de instancia e de classe.

Execute o código abaixo que você vai entender:

class Veiculo(object):
  
   # este atributo sera visivel e compartilhado entre todas as instancias inclusive quando alterado.
   cor_classe   = "preto" # Ford style: "qualquer cor desde que seja preto" 
 
   def __init__(self, pMarca):
       self.marca           = pMarca
       # Este atributo somente sera visivel para a instancia.
       self.cor_instancia   = self.cor_classe

   def muda_cor(self, pNovaCor):
       self.cor_instancia = pNovaCor

   def show(self):
       print "MARCA: %s COR DEFAULT: %s COR CUSTOMIZADA: %s" % (self.marca, self.cor_classe, self.cor_instancia)

def main():
    uno = Veiculo("Fiat")
    uno.show() # MARCA: Fiat COR DEFAULT: preto COR CUSTOMIZADA: preto
   
    uno.muda_cor("amarelo")
    uno.show() # MARCA: Fiat COR DEFAULT: preto COR CUSTOMIZADA: amarelo

    # Alterei a propriedade para todas as instancias.
    Veiculo.cor_classe = "Laranja"

    palio = Veiculo("Fiat")
    
    print "Palio"
    palio.show() # MARCA: Fiat COR DEFAULT: Laranja COR CUSTOMIZADA: Laranja

    print "Uno"
    uno.show()  # MARCA: Fiat COR DEFAULT: Laranja COR CUSTOMIZADA: amarelo
   
#executa o codigo
main()

Todos estes arquivos para testes podem ser encontrados em meu GitHub no repositório my_lab. http://github.com/CristianOliveiraDaRosa/my_lab

Comments are closed.