Polymorphism is a fundamental concept in object-oriented programming (OOP) that allows objects of different classes to be treated as objects of a common superclass. It enables flexibility and code reuse by allowing methods to behave differently based on the object they are invoked on. This topic will cover everything you need to know about polymorphism in Python, from the basics to more advanced topics, with detailed examples and explanations.
Polymorphism, derived from Greek words “poly” meaning many and “morph” meaning form, refers to the ability of objects to take on different forms. In OOP, it allows different classes to be treated as instances of a common superclass, enabling flexibility and extensibility in code design.

Method overriding is a form of run-time polymorphism where a subclass provides a specific implementation of a method that is already defined in its superclass. It allows subclasses to customize or extend the behavior of inherited methods.
class Animal:
def sound(self):
return "Generic sound"
class Dog(Animal):
def sound(self):
return "Woof!"
# Creating an object of the Dog class
dog = Dog()
print(dog.sound()) # Output: Woof!
Dog class overrides the sound method of the Animal class with its own implementation, returning “Woof!” instead of the generic sound.Operator overloading is a form of compile-time polymorphism that allows operators to be redefined for custom classes. It enables objects to behave like built-in types by defining special methods that handle arithmetic, comparison, and other operations.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
# Creating Point objects
point1 = Point(1, 2)
point2 = Point(3, 4)
# Adding two Point objects
result = point1 + point2
print(f"Result: ({result.x}, {result.y})") # Output: Result: (4, 6)
Point class with x and y coordinates.+ operator by defining the __add__ method, which returns a new Point object with coordinates obtained by adding the corresponding coordinates of two Point objects.Duck typing is a concept in Python that focuses on an object’s behavior rather than its type. It allows objects of different types to be used interchangeably if they support the required methods or attributes.
class Duck:
def sound(self):
return "Quack!"
class Cat:
def sound(self):
return "Meow!"
# Function that accepts any object with a 'sound' method
def make_sound(animal):
print(animal.sound())
# Creating Duck and Cat objects
duck = Duck()
cat = Cat()
# Passing Duck and Cat objects to the function
make_sound(duck) # Output: Quack!
make_sound(cat) # Output: Meow!
Duck and Cat classes have a sound method.make_sound function accepts any object with a sound method, regardless of its actual type.Abstract Base Classes (ABCs) are classes that cannot be instantiated directly and are designed to serve as base classes for other classes. They define abstract methods that must be implemented by concrete subclasses, enforcing a contract for classes that inherit from them.
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# Attempting to create an instance of Shape (Abstract Base Class)
shape = Shape() # Raises TypeError
Shape class is an abstract base class with an abstract method area.Rectangle class inherits from Shape and implements the area method.Shape directly results in a TypeError, as abstract classes cannot be instantiated.Method overloading is a form of compile-time polymorphism where multiple methods with the same name but different signatures are defined within a class. Python does not support method overloading in the traditional sense, but you can achieve similar behavior using default arguments or variable-length argument lists.
class Calculator:
def add(self, x, y):
return x + y
def add(self, x, y, z):
return x + y + z
# Creating a Calculator object
calc = Calculator()
# Calling the overloaded add method
print(calc.add(2, 3)) # Output: TypeError: add() missing 1 required positional argument: 'z'
print(calc.add(2, 3, 4)) # Output: 9
Calculator class defines two add methods with different numbers of parameters.add method with two arguments, Python raises a TypeError because it attempts to call the second add method, which requires three arguments.Magic methods, also known as dunder methods (double underscore methods), are special methods in Python surrounded by double underscores (__). They allow operators and built-in functions to be overloaded for custom classes, enabling intuitive behavior for objects in various contexts.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
# Creating Point objects
point1 = Point(1, 2)
point2 = Point(3, 4)
# Adding two Point objects
result = point1 + point2
print(f"Result: ({result.x}, {result.y})") # Output: Result: (4, 6)
Point class overloads the + operator by implementing the __add__ magic method.+ operator is used with two Point objects, Python internally calls the __add__ method, which returns a new Point object with coordinates obtained by adding the corresponding coordinates of the two points.Polymorphism is a powerful concept in Python that promotes flexibility and code reuse by allowing objects to exhibit different behaviors based on their types or the context in which they are used. By understanding and leveraging method overriding, operator overloading, duck typing, abstract base classes, and method overloading, you can write more expressive and adaptable code in Python. Polymorphism enhances code readability, promotes modularity, and fosters code reuse, making it an indispensable aspect of object-oriented programming. Mastering polymorphism is essential for any Python programmer looking to write clean, maintainable, and extensible code. Keep exploring and applying polymorphic concepts in your Python projects to unlock their full potential and become a proficient Python developer. Happy Coding!❤️
