1 of 22

Classes e Objetos

2 of 22

Motivação

  • Vamos supor que uma empresa deseja que seja desenvolvido um programa em Python que manipule informações sobre seus funcionários, tais como:
      • Nome;
      • Número de matrícula;
      • Salário.

  • Para armazenar essas informações de um funcionário, poderíamos criar uma variável para cada informação:

nome

matricula

salario

3 of 22

Talvez listas fossem uma solução. Será?

  • Entretanto, seria interessante se fosse possível agrupar todas as informações que dizem respeito ao funcionário. Isto fica bastante complicado de fazer usando uma lista, já que seria necessário lembrar qual a informação está guardada em cada índice da lista.
  • Existe, sim, uma maneira de agruparmos este conjunto de variáveis de tipos diferentes de uma maneira simples.
  • Classes: Estruturas de dados definidas pelo usuário
    • Podem agrupar variáveis de tipos diferentes
    • As variáveis (atributos ou membros) de uma classe possuem nomes diferentes, mas são relacionadas e referenciadas por um nome comum
    • Um objeto é um exemplar de uma classe

4 of 22

Definindo uma classe

  • Uma maneira simples de criar uma classe em Python seria:

class Rótulo:

def __init__(self):

self.variavel1 = valor_default1

self.variavel2 = valor_default2

...

self.variaveln = valor_defaultn

  • A palavra class apresenta a definição da classe.
  • O Rótulo define um nome para a classe.
  • O método especial __init__ permite construir objetos de uma classe.
  • A palavra self é uma palavra especial que significa o próprio objeto de uma classe.
  • O que é referenciado com self dentro de qualquer método de uma classe é chamado de atributo (ou membro) da classe.
  • Cada atributo pode ter um valor default ao ser criado um objeto da classe.

5 of 22

  • A definição de uma classe capaz de armazenar as informações de um funcionário ficaria assim:

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

  • Dessa forma, a classe funcionário passa a ser um tipo de dados e é possível, então, criar uma variável deste tipo (Funcionario) da seguinte maneira:

f1 = Funcionario()

  • Este tipo de variável é chamada de objeto. Cada objeto é um exemplar de uma classe diferente dos outros objetos da classe.

Definindo uma classe e objetos da classe

6 of 22

Alterando e acessando atributos de um objeto

  • Os atributos de um objeto podem ser acessados através do operador de acesso "ponto" (.)

  f1 = Funcionario()

  f1.nome = 'Pedro'

f1.matricula = 71400500

f1.salario = 2500.75

print(f1.nome)

print(f1.matricula)

print(f1.salario)

7 of 22

Exemplo 1: Cadastrando um objeto simples

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

# Programa principal

f1 = Funcionario()

print("Entre com os dados do funcionário...")

f1.nome = input("Digite o nome: ")

f1.salario = float(input("Digite o salário: "))

f1.matricula = int(input("Digite a matrícula: "))

print("Os dados lidos foram:")

print("Numero de matricula: %d" % f1.matricula)

print("Salario: %.2f" % f1.salario)

print(“Nome: %s" % f1.nome)

8 of 22

  • Podemos ter uma estrutura de dados (e.g., lista, dicionário, tupla) como atributo de um objeto
  • Exemplo: acrescentar número de horas extras por dia do mês corrente.

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

self.horasExtras = {}

  • Para inserir 10 horas no 5º dia do mês, faríamos:

f = Funcionario()

f.horasExtras[5] = 10

Estruturas de dados dentro de uma classe

9 of 22

  • Classes não agregam apenas atributos de um mesmo conceito. Podem também ter métodos próprios.
  • Um método é como uma função, mas que existe apenas dentro da classe
  • Exemplo: cálculo da idade de um funcionário em uma classe que guarda o ano de nascimento dele.

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

self.anoNascimento = 0

  • Como fazer para encontrar a idade do funcionário?

Métodos de uma classe

10 of 22

Exemplo 2: Calculando a idade de um funcionário

from datetime import date

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

self.anoNascimento = 0

def idade(self):

anoAtual = date.today().year

idade = anoAtual – self.anoNascimento

return idade

# Programa principal

f1 = Funcionario()

print("Entre com os dados do funcionário...")

f1.nome = input("Digite o nome: ")

f1.salario = float(input("Digite o salário: "))

f1.matricula = int(input("Digite a matrícula: "))

f1.anoNascimento = int(input("Ano de nascimento: "))

print(“A idade do funcionário é %d. " % f1.idade())

11 of 22

class Ponto:

def __init__(self):

self.x = 0.0

self.y = 0.0

class Reta:

def __init__(self):

self.p1 = Ponto()

self.p2 = Ponto()

# programa principal

r = Reta()

r.p1.x = 100.0

r.p1.y = 200.5

r.p2.x = float(input("Digite a abscissa do ponto: "))

r.p2.y = float(input("Digite a ordenada do ponto: "))

print("P1 = (%f, %f)" % (r.p1.x, r.p1.y))

print("P2 = (%f, %f)" % (r.p2.x, r.p2.y))

Exemplo 3: Classes dentro de uma classe

12 of 22

Exemplo 4: Objetos podem ser passados como parâmetros de uma função. E sempre são passados por referência.

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

def leFuncionario(f):

print("Entre com os dados do funcionário...")

f.nome = input("Digite o nome: ")

f.salario = float(input("Digite o salário: "))

f.matricula = int(input("Digite a matrícula: "))

# programa principal

func = Funcionario()

leFuncionario(func)

print("Os dados lidos foram:")

print("Nome: %s" % func.nome)

print("Salario: %.2f" % func.salario)

print("Matricula: %d" % func.matricula)

13 of 22

  • Podemos criar uma lista para armazenar funcionários da seguinte maneira:

funcionarios = []

funcionarios.append(Funcionario())

  • Em cada posição da lista armazenaremos um funcionário.
  • Para acessar os membros de cada posição da lista, indexamos normalmente o elemento da lista:

funcionarios[0].nome = 'Pedro'

funcionarios[0].salario = 3500.32

funcionarios[0].matricula = 123

  • Podemos criar o objeto completo primeiro e, em seguida, adicioná-lo à lista:

f = Funcionario()

f.nome = 'Paulo'

f.salario = 1700.00

f.matricula = 456

funcionarios.append(f)

Listas de objetos

14 of 22

Exemplo 5: Faça um programa para receber os dados de 50 funcionários e, em seguida, listá-los.

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

# programa principal

funcionarios = []

for i in range(50):

print("Entre com os dados do funcionário %d: " % (i+1))

f = Funcionario()

f.nome = input("Digite o nome: ")

f.salario = float(input("Digite o salário: "))

f.matricula = int(input("Digite a matrícula: "))

funcionarios.append(f)

print("\n\nOs dados lidos foram:\n")

for i in range(50):

print("Funcionario %d:" % (i+1))

print("Nome: %s" % funcionarios[i].nome)

print("Matricula: %d" % funcionarios[i].matricula)

print("Salario: %.2f" % funcionarios[i].salario)

15 of 22

Exemplo 5: Simplificando o loop para listar os funcionários

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

# programa principal

funcionarios = []

for i in range(50):

print("Entre com os dados do funcionário %d: " % (i+1))

f = Funcionario()

f.nome = input("Digite o nome: ")

f.salario = float(input("Digite o salário: "))

f.matricula = int(input("Digite a matrícula: "))

funcionarios.append(f)

print("\n\nOs dados lidos foram:\n")

for funcionario in funcionarios:

print(“Próximo Funcionario:" )

print("Nome: %s" % funcionario.nome)

print("Matricula: %d" % funcionario.matricula)

print("Salario: %.2f" % funcionario.salario)

16 of 22

  • Podemos criar um dicionário para armazenar funcionários:

funcionarios = {}

funcionarios[123] = Funcionario()

  • Em cada posição do dicionário, armazenaremos um par chave-valor de funcionário. A chave é como um código do funcionário.
  • Para acessar os membros de cada posição da dicionário, indexamos normalmente o elemento do dicionário pela chave:

funcionarios[123].nome = 'Pedro'

funcionarios[123].salario = 3500.32

funcionarios[123].matricula = 123

  • Podemos criar o objeto completo primeiro e, em seguida, adicioná-lo ao dicionário:

f = Funcionario()

f.nome = 'Paulo'

f.salario = 1700.00

f.matricula = 456

funcionarios[456] = f

funcionarios[f.matricula] = f

Dicionários de objetos

17 of 22

Exemplo 5: Usando dicionários no lugar de listas para ler e listar 50 funcionários

class Funcionario:

def __init__(self):

self.nome = ''

self.matricula = 0

self.salario = 0.0

# programa principal

funcionarios = {}

for i in range(50):

print("Entre com os dados do funcionário %d: " % (i+1))

f = Funcionario()

f.nome = input("Digite o nome: ")

f.salario = float(input("Digite o salário: "))

f.matricula = int(input("Digite a matrícula: "))

funcionarios[f.matricula] = f

print("\n\nOs dados lidos foram:\n")

for chave in funcionarios:

print("Funcionario %d:" % chave)

funcionario = funcionarios[chave]

print("Nome: %s" % funcionario.nome)

print("Matricula: %d" % funcionario.matricula)

print("Salario: %.2f" % funcionario.salario)

18 of 22

Construtores

Suponha que temos uma coleção de objetos da classe Estudante:

from datetime import date

class Estudante:

def __init__(self):

self.nome = ''

# a matrícula será a chave

self.matricula = 0

self.anoNascimento = 0

def idade(self):

anoAtual = date.today().year

idade = anoAtual - self.anoNascimento

return idade

19 of 22

É possível criar objetos da classe Estudante, passando parâmetros já com os valores iniciais desejados

from datetime import date

class Estudante:

def __init__(self,nome,matricula,anoNascimento):

self.nome = nome

# a matrícula será a chave

self.matricula = matricula

self.anoNascimento = anoNascimento

def idade(self):

anoAtual = date.today().year

idade = anoAtual - self.anoNascimento

return idade

20 of 22

Como ficam os objetos construídos desta nova forma?

# Em vez de fazer:

estudante = Estudante()

estudante.nome = 'Marcos Santos'

estudante.matricula = 19211175

estudante.anoNascimento = 1997

#Faz-se:

estudante = Estudante('Marcos Santos', 19211175, 1999)

estudante2 = Estudante('José Lima', 20111102, 2001)

21 of 22

Exercícios

  1. Foi feita uma pesquisa em uma cidade. De cada entrevistado, foram coletados os seguintes dados: nome, idade, sexo, número de filhos e salário. Escreva um programa que contenha uma classe capaz de armazenar os dados de cada entrevistado, leia e armazene os dados de 120 entrevistados em um dicionário e escreva uma função para cada um dos itens abaixo:
    1. Calcule e retorne a média salarial dos entrevistados;
    2. Ache e imprima o sexo dos entrevistados com salário mais alto e mais baixo;
    3. Calcule e retorne a quantidade de pessoas com menos de 30 anos, mais de 5 filhos e salário menor que R$ 1.000,00;
    4. Calcule e retorne a porcentagem de pessoas do sexo feminino que possuem filhos que responderam a pesquisa.

22 of 22

Exercícios

  1. Um cliente em um banco é representado por:
      • Número da conta – um número inteiro;
      • Número da agência – um número inteiro;
      • Nome do cliente – uma string;
      • Saldo – um número real.

Escreva um programa que defina uma classe capaz de armazenar um cliente do banco. Seu programa deve ler os dados de 2000 clientes e armazená-los em um vetor. Em seguida, seu programa deve chamar funções para calcular a média dos saldos dos clientes, encontrar o número da conta e da agência do cliente com maior saldo e a conta e a agência do cliente com menor saldo. Além disso, deve calcular a porcentagem de clientes com saldo inferior a R$1000,00. Todas as respostas devem ser mostradas pelo programa principal.