Exemplos de OO (demonstrados no colab)

# -*- 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')
Última atualização: quinta, 17 mar 2022, 12:39