Challenge 1: Shape Hierarchy — Possible Solution ==================================================================== class Shape: def area(self): return 0 class Square(Shape): def __init__(self, side): self.side = side def area(self): return self.side ** 2 class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14159 * self.radius ** 2 shapes = [Square(4), Circle(3)] for shape in shapes: print(shape.area()) Output: 16 28.27431 WHY THIS WORKS AS AN ANSWER ------------------------------ class Square(Shape) and class Circle(Shape) both reuse this chapter's own class Dog(Animal) inheritance syntax — each becomes a subclass of Shape, inheriting from it while adding its own __init__ and its own area() method. Both subclasses OVERRIDE Shape's area() (which just returns 0) with their own correct formula — side ** 2 for a square, using the exponent operator from Course 1, and 3.14159 * radius ** 2 for a circle. This is the exact overriding pattern this chapter's Dog/speak() example demonstrated, just applied to a calculation instead of a returned string. The for loop then reuses the chapter's own polymorphism example directly: it calls shape.area() on each object without ever checking "is this a Square or a Circle?" — each object automatically runs its own class's version of area(), which is the entire point of polymorphism demonstrated with the Dog/Cat speak() example earlier in the chapter.