Python tutorials > Object-Oriented Programming (OOP) > Polymorphism > What is interface polymorphism?
What is interface polymorphism?
Interface polymorphism, in the context of object-oriented programming, refers to the ability of different classes to implement the same interface and, therefore, be treated as interchangeable objects based on that common interface. This allows for writing more flexible and maintainable code because you can work with objects through their interface rather than their specific class.
Core Concepts
Interface polymorphism centers around defining a contract (the interface) that multiple classes can adhere to. This contract specifies methods that each implementing class must provide. The beauty lies in the fact that you can then write code that interacts with these classes *solely* through the defined interface, without needing to know the specific class type. This decoupling promotes modularity and reduces dependencies.
Defining an Interface (Abstract Base Class)
In Python, we often use Abstract Base Classes (ABCs) from the abc
module to define interfaces. Here, Shape
is an abstract class with abstract methods area
and perimeter
. Any concrete class that inherits from Shape
*must* implement these methods.
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
Implementing the Interface
Here, Circle
and Square
both inherit from Shape
and provide concrete implementations for the area
and perimeter
methods. They fulfill the contract defined by the Shape
interface.
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius * self.radius
def perimeter(self):
return 2 * 3.14159 * self.radius
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
def perimeter(self):
return 4 * self.side
Using the Interface Polymorphically
The print_shape_details
function takes a Shape
object as input. It doesn't care whether it's a Circle
or a Square
. It only knows that it can call the area
and perimeter
methods, thanks to the Shape
interface. This is polymorphism in action.
def print_shape_details(shape: Shape):
print(f"Area: {shape.area()}")
print(f"Perimeter: {shape.perimeter()}")
circle = Circle(5)
square = Square(4)
print_shape_details(circle)
print_shape_details(square)
Real-Life Use Case: Payment Processing
Imagine a payment processing system. You might have an interface called PaymentProcessor
with methods like process_payment
and refund_payment
. Different payment methods (CreditCard, PayPal, Bitcoin) can implement this interface. The core payment processing logic can then work with any PaymentProcessor
implementation, making it easy to add new payment methods without modifying the existing code.
Best Practices
When to use Interface Polymorphism
Use interface polymorphism when you need to create systems that are easily extensible and adaptable to future changes. It's particularly useful in scenarios involving plugins, drivers, or any situation where you want to decouple components and allow for different implementations to be swapped in and out.
Pros
Cons
FAQ
-
What is the difference between interface polymorphism and inheritance polymorphism?
Inheritance polymorphism relies on class hierarchies and inheritance. A subclass can be treated as its parent class. Interface polymorphism, on the other hand, focuses on interfaces that define contracts. Classes that implement the same interface can be treated interchangeably regardless of their inheritance hierarchy.
-
Can a class implement multiple interfaces?
Yes, in Python (and many other languages), a class can implement multiple interfaces (Abstract Base Classes). This allows a class to conform to multiple contracts and be used in various contexts.