Abstraction

5 min read

Simplifying Complexity by Hiding the Details

Abstraction is one of the core pillars of Object-Oriented Programming (OOP), and it’s all about showing only the essential features of an object while hiding the unnecessary details.

Imagine you’re driving a car:

  • You just need to know how to steer, accelerate, brake, and shift gears.
  • You don’t need to know how the engine works, the internal wiring, or the complex mechanics.

This is abstraction in real life — simplifying the interface for the user while hiding the complex inner workings.

Why Abstraction? #

  • Simplifies the interaction with complex systems.
  • Reduces programming complexity by focusing on what an object does instead of how it does it.
  • Improves code maintainability and readability.
  • Protects the internal state of objects.
  • Helps design modular programs where parts are independent and only interact through defined interfaces.

Abstraction vs Encapsulation: What’s the Difference? #

They’re closely related, but not the same:

ConceptFocusWhat it Does
EncapsulationHiding the internal data and protecting itBundles data & methods; controls access with private/protected members
AbstractionHiding the complexity and showing only necessary partsDefines an interface to interact with an object without exposing internal details

How is Abstraction Achieved in Python? #

Python supports abstraction through:

  • Abstract Classes and Methods (using abc module)
  • Interfaces (via abstract base classes)
  • Hiding complexity by providing simple methods

Abstract Base Classes (ABCs) and Abstract Methods #

Python’s abc module provides a way to create abstract base classes that cannot be instantiated directly and contain abstract methods that must be implemented by subclasses.

Why use Abstract Classes? #

  • To define a blueprint for other classes.
  • To enforce that certain methods are implemented in subclasses.
  • To provide a common interface for a group of related classes.

Example: Abstract Class in Python #

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

    def honk(self):
        print("Beep beep!")

# Trying to instantiate Vehicle will give an error
# vehicle = Vehicle()  # TypeError: Can't instantiate abstract class

class Car(Vehicle):
    def start_engine(self):
        print("Car engine started.")

    def stop_engine(self):
        print("Car engine stopped.")

class Motorcycle(Vehicle):
    def start_engine(self):
        print("Motorcycle engine started.")

    def stop_engine(self):
        print("Motorcycle engine stopped.")

# Using the classes:
car = Car()
car.start_engine()  # Car engine started.
car.honk()          # Beep beep!
car.stop_engine()   # Car engine stopped.

What’s happening here? #

  • Vehicle is an abstract class with two abstract methods.
  • It defines a contract: any subclass must implement start_engine and stop_engine.
  • Car and Motorcycle implement those methods.
  • You can’t create an object of Vehicle directly because it’s abstract.
  • This enforces uniformity and abstraction across different vehicle types.

Abstraction Without Abstract Classes #

Sometimes you don’t need to use abc for abstraction. Simply providing a clean interface to your class and hiding details works fine.

Example:

class CoffeeMachine:
    def __init__(self):
        self.__water_level = 100

    def make_coffee(self, cups):
        if self.__water_level >= cups * 10:
            self.__water_level -= cups * 10
            print(f"Making {cups} cup(s) of coffee.")
        else:
            print("Not enough water!")

    def refill_water(self):
        self.__water_level = 100
        print("Water refilled.")

# User just calls make_coffee without worrying about water management
machine = CoffeeMachine()
machine.make_coffee(3)  # Making 3 cup(s) of coffee.
machine.make_coffee(8)  # Not enough water!
machine.refill_water()  # Water refilled.

Here, the user interacts only with make_coffee and refill_water — they don’t worry about water level tracking, which is hidden internally.


Benefits of Abstraction #

  • Focus on what an object does, not how.
  • Makes code easier to understand and maintain.
  • Allows programmers to build complex systems more easily.
  • Encourages modular and reusable code.
  • Enhances security by hiding sensitive details.

Real-World Use Case: Payment Gateway System #

Imagine you’re building an app that supports multiple payment methods (credit card, PayPal, crypto, etc.):

You want to abstract the payment process so that the app doesn’t worry about the specific details of each payment method.

from abc import ABC, abstractmethod

class PaymentProcessor(ABC):
    @abstractmethod
    def pay(self, amount):
        pass

class CreditCardProcessor(PaymentProcessor):
    def pay(self, amount):
        print(f"Processing credit card payment of ${amount}.")

class PayPalProcessor(PaymentProcessor):
    def pay(self, amount):
        print(f"Processing PayPal payment of ${amount}.")

def process_payment(processor: PaymentProcessor, amount):
    processor.pay(amount)

# Usage
cc = CreditCardProcessor()
pp = PayPalProcessor()

process_payment(cc, 100)  # Processing credit card payment of $100.
process_payment(pp, 50)   # Processing PayPal payment of $50.

Here:

  • PaymentProcessor defines the abstract interface.
  • Each payment method implements the pay method.
  • The app code just calls process_payment without worrying about payment details.
  • Adding new payment methods later is easy — just create new subclasses.

When to Use Abstraction? #

  • When you want to hide complex implementation details.
  • When you want to define common interfaces for different types.
  • When building large applications where many developers work on different components.
  • When designing extensible systems where new features can be added without changing existing code.

Abstraction Best Practices #

  • Use abstract base classes (abc) when you want to enforce method implementation.
  • Design your classes so they expose simple, clear interfaces.
  • Hide internal workings behind private attributes and methods.
  • Avoid exposing unnecessary internal details.
  • Write documentation to explain what your interface does, not how.

Summary: Abstraction in a Nutshell #

  • Abstraction simplifies complex reality by hiding unnecessary details.
  • It provides a clean interface to interact with objects.
  • Python’s abc module helps create abstract base classes and abstract methods.
  • It’s a powerful tool to design modular, extensible, and maintainable software.
  • Together with encapsulation, abstraction forms the backbone of strong OOP design.

What’s Next? #

Ready to explore Inheritance, the next pillar that lets classes inherit properties and methods from others, saving you tons of code repetition? Or want to try some abstraction exercises or real-world examples? Just say the word!

Updated on June 9, 2025