×
   ❮   
PYTHON FOR DJANGO DJANGO FOR BEGINNERS DJANGO SPECIFICS Roadmap
     ❯   

OOP IN PYTHON

Polymorphism

Understanding Polymorphism in Python

Introduction

Polymorphism is a core concept in Object-Oriented Programming (OOP) that allows objects of different classes to be treated as objects of a common superclass. This ability to use a common interface for different data types can greatly enhance the flexibility and reusability of your code. In Python, polymorphism is implemented through method overriding and dynamic method resolution.

What is Polymorphism?

Polymorphism enables methods to do different things based on the object it is acting upon, even if the method name is the same across different classes. This feature allows for more generic and reusable code.

Example:


class Animal:
    def sound(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Dog(Animal):
    def sound(self):
        return "Woof!"

class Cat(Animal):
    def sound(self):
        return "Meow!"

# Creating instances of Dog and Cat
dog = Dog()
cat = Cat()

print(dog.sound())  # Outputs: Woof!
print(cat.sound())  # Outputs: Meow!

In this example, both the Dog and Cat classes have a sound method. Although they share the same method name, each class provides its own implementation. This is a classic demonstration of polymorphism in action.

Polymorphism in Django

In Django, polymorphism can be particularly useful when working with models that share some common functionality but also have specialized behaviors. For instance, you might have a base model called Content and derived models like Article, Video, and Image, each implementing its own version of a render method.

Example:

from django.db import models

class Content(models.Model):
    title = models.CharField(max_length=200)

    def render(self):
        raise NotImplementedError("Subclasses must implement this method")

class Article(Content):
    body = models.TextField()

    def render(self):
        return f"{self.title} {self.body}"

class Video(Content):
    video_url = models.URLField()

    def render(self):
        return f"{self.title} <video src="{self.video_url}" controls="controls" width="300" height="150"></video >"
class Image(Content):
    image_url = models.URLField()

    def render(self):
        return f"{self.title}<img src="{self.image_url}" alt="{self.title}">"

In this example, the Content model defines a common render method, which is then overridden in each derived model to produce different types of content. This allows for a consistent interface while enabling specialized behavior for each content type.

Polymorphism with Collections

Polymorphism becomes particularly powerful when used with collections of objects. For example, you can handle a list of Content objects and call the render method on each object without worrying about its specific type.

Example:

contents = [Article(title="Django Tips", body="Some tips on Django."), 
            Video(title="Django Tutorial", video_url="http://example.com/video"), 
            Image(title="Django Logo", image_url="http://example.com/image")]
for content in contents:
    print(content.render())

In this example, the render method is called on each object in the contents list. Despite the different types of objects, the appropriate render method is invoked for each type.

Conclusion

Polymorphism is a versatile and powerful concept in Python that enhances code flexibility and reusability. By allowing objects of different classes to be treated as instances of a common superclass, you can write more generic code that can handle various types of objects uniformly. Understanding and utilizing polymorphism can significantly improve the design and maintainability of your Django applications.