Explanation

- Polymorphism allows different classes to provide their own implementation of a method that is defined in a parent class. It allows you to use the same method name for different behaviors depending on the object that is calling it. Polymorphism can be achieved through **method overriding** in the subclass or **method overloading** (though Python doesn’t support method overloading directly).
  
  **Key Points**:
	- **Method Overriding**: A child class provides a specific implementation of a method that is already defined in the parent class.
	- **Dynamic Method Resolution**: The correct method is determined at runtime based on the object’s type.

-

Steps

  • Define a method in the parent class.
  • Override the method in child classes to provide specific behaviors.
  • Use the same method name, and the correct behavior will be chosen depending on the object type.
class Dog:
    def sound(self):
        print("Woof!")
 
class Cat:
    def sound(self):
        print("Meow!")
 
def make_sound(animal):
    animal.sound()
 
dog = Dog()
cat = Cat()
 
make_sound(dog)  # Output: Woof!
make_sound(cat)  # Output: Meow!