Enviar um café pro programador

Composição em Python: Classe usando Classe

Neste tutorial, vamos aprender um dos conceitos mais importantes em POO, a composição.
Acesse o Python Progressivo offline: Apostila em PDF

O que é Composição em Python

Até o momento, nos exemplos em que simulamos uma empresa, usamos apenas um tipo de objeto, da classe Funcionario, que representa os trabalhadores da empresa que você foi contratado para trabalhar.

Porém, existem uma porção de outros objetos nesta empresa.
Aliás, vamos chamar a empresa de uma classe, a Empresa.

O que tem dentro dela?
Setores: RH, TI, Secretaria etc
Pessoas: Funcionários, Terceirizados etc
Local físico: Escritórios, Banheiros, Copa etc
Material: Móveis, Armários, folhas, canetas etc

Note uma coisa dentro dela: Funcionários.
Sim, Empresa é uma classe, e tem dentro dela outra classe, a Funcionario.
Podemos tratar o setor de RH e TI como classes também, e todos os demais exemplos acima.

Sua empresa é um objeto de classe Empresa que trabalha junto com o objeto Correios, por exemplo.
Podemos criar a classe Almoxarifado para lidar com material, onde por exemplo, cartucho de tinta ou caneta seriam objetos dessa classe.

Ou seja, na verdade, o nosso mundo é um punhado de objetos, compostos de outros objetos dentro, além de lidar com outros objetos de fora.

Damos a isso o nome de composição: combinação de objetos, quando instanciamos objetos de uma classe dentro de outra, quando usamos objetos de uma classe dentro de outros objetos.

Vamos ver um exemplo real de situação e código, para entendermos melhor o que é composição na prática.

Exemplo de Composição em Python

Vamos usar novamente nossa classe Funcionario.
Para contratar um funcionário, você deve instanciar um objeto e passar uma string com o nome dele, e o método __init__ já cria o objeto com o nome do funcionário.

Vamos criar outro método, o retornaNome, que retorna o nome do funcionário.


Agora vamos abrir uma empresa!
Vamos criar a classe Empresa que vai representar nossa firma em funcionamento.

Ela vai ter uma lista de funcionários, a func. Inicializamos essa variável como uma lista vazia, e a medida que formos contratando, vamos adicionando funcionários nele. E quem são esses? Objetos da classe Funcionario, ou seja, vamos estar fazendo composição!

Assim que o objeto da classe Empresa é criado, o método __init__ é executado.
Dentro dele vamos colocar um looping infinito ( while True), afinal, nossa empresa está sempre em funcionamento.

Perguntamos se o usuário deseja contratar alguém ou apenas ver a lista de funcionários.

Se ele desejar contratar, invocamos o método contratar(), que vai pedir um nome (variável nome) do funcionário, criar um objeto da classe Funcionario: Funcionario( nome ) e vai colocar esse funcionário na nossa lista: func.append( Funcionario(nome) )

Prontinho, funcionário contratador.
Se quiser ver todos os funcionários da sua empresa, basta digitar 2, que vai chamar o método exibir(), que simplesmente vai pegar a lista func de funcionários, ir em cada objeto dessa lista e executar o método retornaNome(), que vai exibir o nome de cada funcionário de sua empresa.

Prontinho. Agora, para criar nossa empresa, basta instanciar um objeto dela e o __init__ já vai fazer tudo:
Empresa()

Veja como ficou nosso código Python:

class Funcionario:
 def __init__(self, nome):
  self.__nome = nome
 def retornaNome(self):
  return self.__nome

class Empresa:
 func = []
 def __init__(self):
  print("Empresa Tabajara em funcionamento")
  
  while True:
   print("1. Contratar")
   print("2. Exibir lista de funcionarios")
   op=int( input() )
   
   if op==1:
    self.contratar()
   elif op==2:
    self.exibir()
   else:
    print("Opçao invalida")
 
 def contratar(self):
  nome = input("Nome: ")
  self.func.append( Funcionario(nome) )
 
 def exibir(self):
  for funcionario in self.func:
   print(funcionario.retornaNome())  


Empresa()
  
Veja aqui como obter seu certificado do curso de Python e se tornar um programador profissional: Como trabalhar com Python

2 comentários: