Menu
Coddy logo textTech

Sobrescritura de métodos

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 19 de 64.

La sobrescritura de métodos permite que una clase hija proporcione su propia implementación de un método que ya existe en la clase padre.

Aquí hay un ejemplo de una clase padre con 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}")

Crea una clase hija que sobrescriba un método:

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Sobrescribe el método padre

El método make_sound en Dog reemplaza al de Animal, pero info se sigue heredando sin cambios.

Crea instancias y prueba los métodos:

animal = Animal("Generic Animal")
dog = Dog("Buddy")

Llama al método sobrescrito:

animal.make_sound()
dog.make_sound()

Llamar al método no sobrescrito:

animal.info()
dog.info()

Salida:

Some generic animal sound
Woof! Woof!
I am Generic Animal
I am Buddy

Puedes sobrescribir cualquier método heredado:

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()

Salida:

Meow!
I am Whiskers, a sneaky cat

Punto clave: La sobrescritura de métodos permite que las clases hijas personalicen el comportamiento heredado. Simplemente define un método con el mismo nombre en la clase hija. Se utilizará la versión de la clase hija en lugar de la versión de la clase padre.

challenge icon

Desafío

Intermedio

En este desafío, implementarás una jerarquía de formas.

  • shape.py - Contiene la clase padre Shape con el atributo color y sus métodos
  • circle.py - Contiene la clase Circle que hereda de Shape
  • square.py - Contiene la clase Square que hereda de Shape

Cada archivo contiene comentarios TODO detallados que te guiarán paso a paso a través de la implementación.

Hoja de referencia

La anulación de métodos permite que una clase hija proporcione su propia implementación de un método que ya existe en la clase padre.

Ejemplo de clase padre:

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}")

Clase hija anulando un método:

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Anular el método del padre

El método make_sound en Dog reemplaza al de Animal, pero info se sigue heredando sin cambios.

Puedes anular múltiples métodos:

class Cat(Animal):
    def make_sound(self):
        print("Meow!")
    
    def info(self):
        print(f"I am {self.name}, a sneaky cat")

Punto clave: Simplemente define un método con el mismo nombre en la clase hija. La versión de la hija se utilizará en lugar de la versión del padre.

Pruébalo tú mismo

from shape import Shape
from circle import Circle
from square import Square

# Manejador de casos de prueba
test_case = input()

if test_case == "base_shape":
    # Probar la clase 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":
    # Probar la creación de Circle y sus 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":
    # Probar la creación de Square y sus 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":
    # Probar múltiples instancias con diferentes dimensiones
    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()  # Línea vacía para legibilidad

elif test_case == "shape_polymorphism":
    # Probar el comportamiento polimórfico con una 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()  # Línea vacía para legibilidad

elif test_case == "original_test_case":
    # Ejecutar el código de prueba original del desafío
    circle = Circle("red", 5)
    square = Square("blue", 4)

    # Probar el método describe
    circle.describe()
    square.describe()

    # Probar el método area
    print(f"Circle area: {circle.area()}")
    print(f"Square area: {square.area()}")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming