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