Exemplos de OO (demonstrados no colab)
Completion requirements
# -*- coding: utf-8 -*-
import math
class Figura:
def exemplo(self):
print('exemplo de Figura')
def calcPerimetro(self):
pass
def calcArea(self):
pass
class Circulo(Figura):
"""Classe Circulo especializada de Figura
permite representar figuras circular com o raio definido."""
def __init__(self):
self.raio = 0
def calcPerimetro(self):
return self.raio * math.pi * 2
def __str__(self):
return "Circulo(raio=%d)"%(self.raio)
class NaoCirculo(Figura):
def __init__(self):
self.numLados = 0
self.tamLados = tuple()
def exemplo(self):
super().exemplo();
print('exemplo de NaoCirculo')
def calcPerimetro(self):
if self.numLados>0:
soma = 0
for i in range(0,self.numLados):
soma = soma + self.tamLados[i]
return soma
return 0
class Quadrado(NaoCirculo):
def exemplo(self):
super().exemplo();
print('exemplo de Quadrado')
def calcArea(self):
#return super().calcArea()
return self.tamLados[0] * self.tamLados[0]
class Retangulo(NaoCirculo):
def exemplo(self):
print('exemplo de Retangulo')
def calcArea(self):
return self.tamLados[0] * self.tamLados[1]
class Triangulo(NaoCirculo):
def __str__(self):
return 'Triangulo [%d,%d,%d]'%(self.tamLados[0],self.tamLados[1],self.tamLados[2])
def calcArea(self):
# método de heron
a = self.tamLados[0]
b = self.tamLados[1]
c = self.tamLados[2]
p = (a+b+c)/2
return math.sqrt( p*(p-a) * (p-b) * (p-c) )
#
# Exemplo de uso das classes
# Fique atento para observar o que foi generalizado (implementado em uma superclasse)
# e o que foi implementado em uma especialização (subclasse).
#
q = Quadrado()
q.numLados=4
q.tamLados = [ 2,2,2,2]
print('Quadrado')
print('Perimetro : ', q.calcPerimetro() )
print('Área: ', q.calcArea() )
r = Retangulo()
r.numLados=4
r.tamLados = [ 2,3,2,3]
print('Retangulo')
print('Perimetro : ', r.calcPerimetro() )
print('Área: ', r.calcArea() )
t = Triangulo()
t.numLados=3
t.tamLados = [ 3,3,3] #pitagorico - equilatero |_
print('Triangulo')
print('Perimetro : ', t.calcPerimetro() )
print('Área: ', t.calcArea() )
t2 = Triangulo()
t2.numLados=3
t2.tamLados = [ 3,4,5] #pitagorico - equilatero |_
print('Triangulo 2')
print('Perimetro : ', t2.calcPerimetro() )
print('Área: ', t2.calcArea() )
print('Objetos')
print(t)
print(t2)
z = t
print(z)
z.tamLados = [4,4,4]
print(t)
#
# Exemplo do teste É UM
# Um objeto pode ser testado para verificar se ele é de um
# determinado tipo (de uma determinada classe).
# Isso é realizado pela função isinstance(variável, tipo)
#
def usaFigura(x):
if isinstance(x,Figura):
print('Ok eh figura, logo:')
print('o perimetro é:', x.calcPerimetro() )
else:
print('não pode calcular o perimetro pq não é figura')
v = 1
usaFigura(t)
usaFigura(v)
c = Circulo()
print('É Circulo? ', isinstance(t,Circulo))
print('É NaoCirculo? ', isinstance(t,NaoCirculo))
print('É Triangulo? ', isinstance(t,Triangulo))
print('É Circulo? ', isinstance(c,Circulo))
#
# Abaixo o exemplo de "complementação de comportamento" feito nos métodos "exemplos"
# das classes NaoCirculo e Quadrado (a complementação é realizada com o uso do super()).
# E a "sobreescrita" completa do método exemplo realizada na classe Retangulo
#
print('para a instanciacao de Figura')
o1 = Figura()
o1.exemplo()
print('para a instanciacao de NaoCirculo')
o2 = NaoCirculo()
o2.exemplo()
print('para a instanciacao do Quadrado')
o3 = Quadrado()
o3.exemplo()
print('para a instanciacao do Retangulo')
o4 = Retangulo()
o4.exemplo()
#
# Exemplo do uso de recurso da classe (atributo ultimoNumero) e de
# recurso do objeto (self.numero).
#
class NumeracaoUnica:
ultimoNumero = 0
def __init__(self):
NumeracaoUnica.ultimoNumero = NumeracaoUnica.ultimoNumero + 1
self.numero = NumeracaoUnica.ultimoNumero
def __str__(self):
return "%d de %d"%(self.numero,NumeracaoUnica.ultimoNumero)
a = NumeracaoUnica()
b = NumeracaoUnica()
c = NumeracaoUnica()
print(a,b,c, sep='\n')
Last modified: Thursday, 17 March 2022, 12:39 PM