Classes e Objetos
Motivação
nome
matricula
salario
Talvez listas fossem uma solução. Será?
Definindo uma classe
class Rótulo:
def __init__(self):
self.variavel1 = valor_default1
self.variavel2 = valor_default2
...
self.variaveln = valor_defaultn
class Funcionario:
def __init__(self):
self.nome = ''
self.matricula = 0
self.salario = 0.0
f1 = Funcionario()
Definindo uma classe e objetos da classe
Alterando e acessando atributos de um objeto
f1 = Funcionario()
f1.nome = 'Pedro'
f1.matricula = 71400500
f1.salario = 2500.75
print(f1.nome)
print(f1.matricula)
print(f1.salario)
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)
class Funcionario:
def __init__(self):
self.nome = ''
self.matricula = 0
self.salario = 0.0
self.horasExtras = {}
f = Funcionario()
f.horasExtras[5] = 10
Estruturas de dados dentro de uma classe
class Funcionario:
def __init__(self):
self.nome = ''
self.matricula = 0
self.salario = 0.0
self.anoNascimento = 0
Métodos de uma classe
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())
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
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)
funcionarios = []
funcionarios.append(Funcionario())
funcionarios[0].nome = 'Pedro'
funcionarios[0].salario = 3500.32
funcionarios[0].matricula = 123
f = Funcionario()
f.nome = 'Paulo'
f.salario = 1700.00
f.matricula = 456
funcionarios.append(f)
Listas de objetos
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)
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)
funcionarios = {}
funcionarios[123] = Funcionario()
funcionarios[123].nome = 'Pedro'
funcionarios[123].salario = 3500.32
funcionarios[123].matricula = 123
f = Funcionario()
f.nome = 'Paulo'
f.salario = 1700.00
f.matricula = 456
funcionarios[456] = f
funcionarios[f.matricula] = f
Dicionários de objetos
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)
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
É 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
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)
Exercícios
Exercícios
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.