Sobrescrita de Método
Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 19 de 64.
A sobrescrita de método (method overriding) permite que uma classe filha forneça sua própria implementação de um método que já existe na classe pai.
Aqui está um exemplo de uma classe pai com métodos:
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("Some generic animal sound")
def info(self):
print(f"I am {self.name}")Crie uma classe filha que sobrescreve um método:
class Dog(Animal):
def make_sound(self):
print("Woof! Woof!") # Sobrescreve o método paiO método make_sound em Dog substitui o de Animal, mas info ainda é herdado sem alterações.
Crie instâncias e teste os métodos:
animal = Animal("Generic Animal")
dog = Dog("Buddy")Chame o método sobrescrito:
animal.make_sound()
dog.make_sound()Chame o método não sobrescrito:
animal.info()
dog.info()Saída:
Some generic animal sound
Woof! Woof!
I am Generic Animal
I am BuddyVocê pode sobrescrever qualquer método herdado:
class Cat(Animal):
def make_sound(self):
print("Meow!")
def info(self):
print(f"I am {self.name}, a sneaky cat")
cat = Cat("Whiskers")
cat.make_sound()
cat.info()Saída:
Meow!
I am Whiskers, a sneaky catPonto Chave: A sobrescrita de método permite que classes filhas customizem o comportamento herdado. Basta definir um método com o mesmo nome na classe filha. A versão da classe filha será usada em vez da versão da classe pai.
Desafio
MédioNeste desafio, você implementará uma hierarquia de formas.
shape.py- Contém a classe paiShapecom o atributocolore métodoscircle.py- Contém a classeCircleque herda deShapesquare.py- Contém a classeSquareque herda deShape
Cada arquivo contém comentários TODO detalhados que o guiarão passo a passo pela implementação.
Folha de consulta
A sobrescrita de método (method overriding) permite que uma classe filha forneça sua própria implementação de um método que já existe na classe pai.
Exemplo de classe pai:
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("Some generic animal sound")
def info(self):
print(f"I am {self.name}")Classe filha sobrescrevendo um método:
class Dog(Animal):
def make_sound(self):
print("Woof! Woof!") # Sobrescreve o método paiO método make_sound em Dog substitui o da classe Animal, mas info ainda é herdado sem alterações.
Você pode sobrescrever múltiplos métodos:
class Cat(Animal):
def make_sound(self):
print("Meow!")
def info(self):
print(f"I am {self.name}, a sneaky cat")Ponto Chave: Basta definir um método com o mesmo nome na classe filha. A versão da filha será usada em vez da versão da pai.
Experimente você mesmo
from shape import Shape
from circle import Circle
from square import Square
# Manipulador de casos de teste
test_case = input()
if test_case == "base_shape":
# Testa a classe base Shape
shape = Shape("green")
print(f"Color: {shape.color}")
print(f"Area: {shape.area()}")
print("Describe output:")
shape.describe()
elif test_case == "circle_basics":
# Testa a criação do Circle e métodos básicos
circle = Circle("red", 5)
print(f"Color: {circle.color}")
print(f"Radius: {circle.radius}")
print(f"Area (rounded): {round(circle.area(), 2)}")
print("Describe output:")
circle.describe()
elif test_case == "square_basics":
# Testa a criação do Square e métodos básicos
square = Square("blue", 4)
print(f"Color: {square.color}")
print(f"Side length: {square.side_length}")
print(f"Area: {square.area()}")
print("Describe output:")
square.describe()
elif test_case == "various_sizes":
# Testa múltiplas instâncias com dimensões diferentes
shapes = [
Circle("yellow", 2),
Circle("orange", 7.5),
Square("purple", 3),
Square("black", 10)
]
for i, shape in enumerate(shapes, 1):
print(f"Shape {i}:")
shape.describe()
print(f"Area: {round(shape.area(), 2)}")
print() # Linha vazia para legibilidade
elif test_case == "shape_polymorphism":
# Testa o comportamento polimórfico com uma lista de formas
shapes = [
Shape("white"),
Circle("red", 3),
Square("blue", 4)
]
print("Polymorphic behavior demonstration:")
for shape in shapes:
shape.describe()
print(f"Area: {round(shape.area(shape_polymorphism), 2)}")
print() # Linha vazia para legibilidade
elif test_case == "original_test_case":
# Executa o código de teste original do desafio
circle = Circle("red", 5)
square = Square("blue", 4)
# Testa o método describe
circle.describe()
square.describe()
# Testa o método area
print(f"Circle area: {circle.area()}")
print(f"Square area: {square.area()}")Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário