Abstract Base Class

================================

Definition

An Abstract Base Class (ABC) is a class that cannot be instantiated on its own and serves as an interface for other classes. It provides a way to define a common set of methods that must be implemented by any non-Abstract Subclass, while also providing a way to define custom methods.

Syntax


The syntax for defining an Abstract Base Class in Python is:

from [ABC](/ABC) import [ABC](/ABC), abstractmethod

class AbstractBaseClass([ABC](/ABC)):
    @abstractmethod
    def method1(self):
        pass

    @abstractmethod
    def method2(self):
        pass

In this example, AbstractBaseClass is the Abstract Base Class and it contains two Abstract Methods: method1 and method2.

Implementing Abstract Base Classes

To implement an Abstract Base Class in Python, you must use the [ABC](/ABC) class from the [ABC](/ABC) module:

from [ABC](/ABC) import [ABC](/ABC), abstractmethod

class AbstractBaseClass([ABC](/ABC)):
    @abstractmethod
    def method1(self):
        pass

    @abstractmethod
    def method2(self):
        pass

You can then define any non-Abstract Methods in a subclass as needed.

Benefits

Abstract base classes provide several benefits, including:

  • Encapsulation: Abstract base classes help encapsulate common functionality that can be used by multiple subclasses.
  • Code Reusability: By defining an abstract class with specific method signatures, you can ensure that only the desired behavior is implemented in subclasses.
  • Testability: You can write unit tests to verify that a subclass implements all required methods.

Use Cases

Abstract base classes are commonly used in object-oriented programming (OOP) languages. Here are some examples of how they can be used:

  • Database Interaction: An Abstract Base Class for database interaction might contain methods for executing CRUD operations, while concrete subclasses implement the actual database interactions.
  • File Handling: An Abstract Base Class for file handling might contain methods for reading and writing files, while concrete subclasses implement the specific file formats.
  • Validation: An Abstract Base Class for validation might contain methods for checking user input, while concrete subclasses validate data according to specific rules.

Example Use Cases

from [ABC](/ABC) import [ABC](/ABC), abstractmethod

class DatabaseConnection([ABC](/ABC)):
    @abstractmethod
    def execute_query(self, query):
        pass

    @abstractmethod
    def connect_to_database(self):
        pass

class MySQLConnection(DatabaseConnection):
    def __init__(self, host, database, user, password):
        self.host = host
        self.database = database
        self.user = user
        self.password = password

    def execute_query(self, query):
        # Simulate a database connection to MySQL
        print(f"Executing query: {query}")
        return f"{query} executed"

class PostgreSQLConnection(DatabaseConnection):
    def __init__(self, host, database, user, password):
        self.host = host
        self.database = database
        self.user = user
        self.password = password

    def execute_query(self, query):
        # Simulate a database connection to PostgreSQL
        print(f"Executing query: {query}")
        return f"{query} executed"

# Create instances of DatabaseConnection
connection1 = MySQLConnection("localhost", "mydb", "user", "password")
connection2 = PostgreSQLConnection("localhost", "mydb", "user", "password")

# Use the [Abstract Base Class](/Abstract_Base_Class) to implement methods in concrete subclasses
class MyService(DatabaseConnection):
    def __init__(self, host, database, user, password):
        self.host = host
        self.database = database
        self.user = user
        self.password = password

    def save_data(self, data):
        # Call the abstract method to execute a query
        return connection1.execute_query("INSERT INTO mytable (column1, column2) VALUES (%s, %s)", [data["column1"], data["column2"]])

# Create an instance of MyService and use it to perform database operations
service = MyService("localhost", "mydb", "user", "password")

In this example, we define an Abstract Base Class DatabaseConnection with two Abstract Methods: execute_query and connect_to_database. We then create concrete subclasses MySQLConnection and PostgreSQLConnection that implement these methods. Finally, we demonstrate how to use the Abstract Base Class in a concrete subclass MyService to perform database operations.

Conclusion

Abstract base classes provide a powerful way to define common functionality for multiple subclasses while ensuring that only the desired behavior is implemented. By following the syntax and best practices outlined in this article, you can create robust and maintainable codebases using Python’s Abstract Base Class feature.