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 padreEl 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 BuddyPuedes 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 catPunto 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.
Desafío
IntermedioEn este desafío, implementarás una jerarquía de formas.
shape.py- Contiene la clase padreShapecon el atributocolory sus métodoscircle.py- Contiene la claseCircleque hereda deShapesquare.py- Contiene la claseSquareque hereda deShape
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 padreEl 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()}")Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias