SyntaxStudy
Sign Up
Python Abstract Classes & ABC
Python Intermediate 10 min read

Abstract Classes & ABC

Abstract Classes & ABC

An abstract class defines an interface that subclasses must implement. Python's abc module provides the tools to enforce this.

Defining an Abstract Class

from abc import ABC, abstractmethod

class Shape(ABC):
    """Abstract base class for shapes."""

    @abstractmethod
    def area(self) -> float:
        """Return the area of the shape."""
        ...

    @abstractmethod
    def perimeter(self) -> float:
        """Return the perimeter of the shape."""
        ...

    def describe(self):
        # Concrete method — shared implementation
        return f"{type(self).__name__}: area={self.area():.2f}"

Concrete Subclasses

import math

class Circle(Shape):
    def __init__(self, r): self.r = r
    def area(self):      return math.pi * self.r ** 2
    def perimeter(self): return 2 * math.pi * self.r

class Square(Shape):
    def __init__(self, s): self.s = s
    def area(self):      return self.s ** 2
    def perimeter(self): return 4 * self.s

# Shape()    # TypeError: Can't instantiate abstract class
c = Circle(5)
print(c.describe())  # Circle: area=78.54

abstractproperty (Modern)

class Vehicle(ABC):
    @property
    @abstractmethod
    def fuel_type(self) -> str: ...

class ElectricCar(Vehicle):
    @property
    def fuel_type(self): return "electric"
Example
from abc import ABC, abstractmethod

class Serializable(ABC):
    @abstractmethod
    def serialize(self) -> str: ...

    @abstractmethod
    def deserialize(self, data: str): ...

class JSONRecord(Serializable):
    def __init__(self, data: dict):
        self.data = data

    def serialize(self) -> str:
        import json
        return json.dumps(self.data)

    def deserialize(self, data: str):
        import json
        self.data = json.loads(data)
        return self

rec = JSONRecord({"id": 1, "name": "Alice"})
raw = rec.serialize()
print(raw)
rec2 = JSONRecord({}).deserialize(raw)
print(rec2.data)
Pro Tip

Abstract classes document your intended interface. If a subclass fails to implement all abstract methods, Python raises TypeError at instantiation time — a clear, early error.