Menu
Coddy logo textTech

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 pai

O 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 Buddy

Você 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 cat

Ponto 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.

challenge icon

Desafio

Médio

Neste desafio, você implementará uma hierarquia de formas.

  • shape.py - Contém a classe pai Shape com o atributo color e métodos
  • circle.py - Contém a classe Circle que herda de Shape
  • square.py - Contém a classe Square que herda de Shape

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 pai

O 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()}")
quiz iconTeste seus conhecimentos

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