Imagine this: You walk into a zoo and shout, “Eat!” The dog starts munching dog food. The cat starts nibbling fish. The parrot pecks on seeds.

You gave the same command“eat!” — but each animal responded differently. That, my friend, is polymorphism in action.

In programming terms:

Polymorphism means “many forms.” It allows the same function or method name to behave differently depending on the object calling it.


🧩 What Is Polymorphism?

Polymorphism is a core concept of Object-Oriented Programming (OOP) that allows you to define a single interface for multiple data types.

In simpler words, it lets you write code that works with objects of different classes — without worrying about their specific types.

Python, being a dynamic language, supports polymorphism naturally — you just call the same method on different objects, and Python decides at runtime which version to use.


🐶🐱 Example: Dog and Cat

class Dog:
    def eat(self):
        print('Eating dog food')

class Cat:
    def eat(self):
        print('Eating cat food')

Now, let’s create objects of both classes:

animal1 = Dog()
animal2 = Cat()

animal1.eat()
animal2.eat()

Output:

Eating dog food
Eating cat food

Both objects respond to the same method call — eat() — but behave differently.

We don’t need to know what kind of animal we’re calling; we just know it can eat. That’s polymorphism.


🧠 The Beauty of Polymorphism

It allows you to:

  • Write generalized code instead of class-specific code.
  • Treat different types of objects interchangeably.
  • Focus on what an object does, not how it does it.

Example:

def feed(animal):
    animal.eat()

Now:

feed(Dog())
feed(Cat())

Output:

Eating dog food
Eating cat food

The feed() function doesn’t care if the object is a Dog, Cat, or Tiger — as long as it has an eat() method, it works.


🔄 Polymorphism in Action — Same Method, Different Class

Let’s add another animal for fun:

class Cow:
    def eat(self):
        print("Eating grass")

Now:

animals = [Dog(), Cat(), Cow()]

for a in animals:
    a.eat()

Output:

Eating dog food
Eating cat food
Eating grass

Python automatically calls the correct version of eat() for each object. This is runtime polymorphism — the behavior depends on the object at runtime.


🧱 Why It’s Important

Reusability: You can use the same function or method name across different classes.

Extensibility: You can add new types (new classes) without changing existing code.

Readability: Your code becomes cleaner and easier to maintain.

In short, you write code once and use it with any object that follows the same interface.


🧩 Polymorphism and Inheritance

In OOP, polymorphism often works alongside inheritance.

For example:

class Animal:
    def eat(self):
        print("Eating...")

class Dog(Animal):
    def eat(self):
        print("Eating dog food")

class Cat(Animal):
    def eat(self):
        print("Eating cat food")

Even though Dog and Cat inherit from Animal, they override the eat() method with their own behavior.

Now, we can treat all animals the same way:

for animal in [Dog(), Cat(), Animal()]:
    animal.eat()

Output:

Eating dog food
Eating cat food
Eating...

Same method name — eat() — different outcomes. That’s polymorphism working through method overriding.


🧰 Polymorphism with Abstract Classes (Interface Design)

Sometimes we design classes that define a common interface, but we let child classes provide their own implementations.

For that, we use abstract base classes (ABC) from the abc module.

Example:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def eat(self):
        pass

class Dog(Animal):
    def eat(self):
        print("Dog eats kibble")

class Cat(Animal):
    def eat(self):
        print("Cat eats fish")

for animal in [Dog(), Cat()]:
    animal.eat()

Output:

Dog eats kibble
Cat eats fish

Now every subclass must define its own eat() method. This ensures all animals share the same interface, enforcing polymorphism safely.


🧮 Real-Life Example: Polymorphism with Built-in Functions

Even Python’s built-in functions use polymorphism.

For example, the len() function works on:

  • Strings
  • Lists
  • Tuples
  • Dictionaries

Example:

print(len("Hello"))
print(len([1, 2, 3]))
print(len({"name": "Python"}))

Output:

5
3
1

The same function (len) behaves differently depending on the object’s type — that’s polymorphism!


🧭 Summary

Concept Description Example
Polymorphism Same method name, different behavior Dog().eat() vs Cat().eat()
Method Overriding Subclasses redefine a method from the parent class Dog overrides Animal.eat()
Interface A common set of methods different classes agree to implement Animal class with eat() method
Abstract Class A class that defines methods but doesn’t implement them class Animal(ABC)
Built-in Example Same function working for multiple types len(), max(), str()

Review Fill-in-the-Gap Questions

  1. Polymorphism means “many __” and allows one interface to represent multiple types.
  2. In Python, different classes can define the same __ name with their own behavior.
  3. Calling the same method on different objects and getting different results is called __ polymorphism.
  4. The feed(animal) function works for any object that defines the method __.
  5. When a subclass defines its own version of a parent method, it is called method __.
  6. Abstract base classes ensure all subclasses share a common __.
  7. The built-in function __ is polymorphic because it works on strings, lists, and dictionaries.
  8. Polymorphism increases code __ and flexibility.
  9. Using polymorphism, we can treat all subclasses of a parent class in a __ way.
  10. In OOP, polymorphism often works together with __ to make systems more extensible.

<
Previous Post
🧭 Python List Comprehensions: A faster, Cleaner, And Smarter Way To Create Lists In Python
>
Blog Archive
Archive of all previous blog posts