Bird
Raised Fist0
Pythonprogramming~10 mins

Abstract base classes overview in Python - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Abstract base classes overview
Define ABC with abstract methods
Create subclass inheriting ABC
Implement all abstract methods
Instantiate subclass object
Use subclass object normally
If abstract methods missing -> Error
This flow shows how to define an abstract base class (ABC), create a subclass that implements all abstract methods, then instantiate and use the subclass. Missing implementations cause errors.
Execution Sample
Python
from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        pass

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

dog = Dog()
print(dog.sound())
Defines an abstract base class Animal with an abstract method sound, then a Dog subclass that implements sound.
Execution Table
StepActionEvaluationResult
1Define class Animal inheriting ABCAnimal has abstract method soundAnimal cannot be instantiated
2Define class Dog inheriting AnimalDog must implement soundDog class created
3Instantiate Dog()Dog has sound implementedDog instance created successfully
4Call dog.sound()sound method runs"Woof!" returned
5Try instantiate Animal()Animal has abstract method unimplementedTypeError: Can't instantiate abstract class Animal with abstract methods sound
💡 Execution stops when trying to instantiate abstract class Animal without implementing abstract methods
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4
AnimalClass with abstract methodUnchangedUnchangedUnchanged
DogNot definedClass defined with sound implementedUnchangedUnchanged
dogNot definedNot definedInstance of Dog createdUnchanged
dog.sound()Not definedNot definedNot defined"Woof!"
Key Moments - 3 Insights
Why can't we create an instance of the abstract base class Animal?
Because Animal has an abstract method sound that is not implemented, Python prevents instantiation to enforce subclass implementation (see execution_table step 5).
What happens if the subclass Dog does not implement the abstract method sound?
Python will raise a TypeError when trying to instantiate Dog, because all abstract methods must be implemented (refer to execution_table step 3).
Why do we use @abstractmethod decorator in the base class?
It marks methods that must be implemented by subclasses, ensuring a consistent interface (see execution_table step 1).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what happens at step 3 when Dog() is instantiated?
ATypeError is raised because Dog does not implement sound
BDog instance is created successfully because sound is implemented
CNothing happens, Dog remains a class
DAnimal instance is created instead
💡 Hint
Check execution_table row 3 for Dog instantiation result
At which step does calling dog.sound() return 'Woof!'?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look at execution_table row 4 for method call and return value
If we remove @abstractmethod decorator from Animal.sound, what changes in the execution?
AAnimal can be instantiated without error
BDog must still implement sound
CDog cannot be instantiated
DNo change at all
💡 Hint
Refer to execution_table step 5 where instantiating Animal raises error due to abstractmethod
Concept Snapshot
Abstract base classes (ABC) define methods subclasses must implement.
Use @abstractmethod to mark these methods.
Cannot instantiate ABC directly if abstract methods are unimplemented.
Subclasses must implement all abstract methods to be instantiated.
This enforces a consistent interface across subclasses.
Full Transcript
This visual execution trace shows how abstract base classes (ABC) work in Python. First, we define an ABC called Animal with an abstract method sound using the @abstractmethod decorator. This means Animal cannot be instantiated directly because sound is not implemented. Next, we create a subclass Dog that inherits from Animal and implements the sound method returning 'Woof!'. When we instantiate Dog, it succeeds because all abstract methods are implemented. Calling dog.sound() returns 'Woof!'. If we try to instantiate Animal directly, Python raises a TypeError because abstract methods are not implemented. This mechanism ensures subclasses follow a required interface.

Practice

(1/5)
1. What is the main purpose of an abstract base class in Python?
easy
A. To store data without any methods
B. To create objects directly from the base class
C. To automatically run code without subclassing
D. To define methods that must be implemented by subclasses

Solution

  1. Step 1: Understand abstract base class role

    An abstract base class sets a template for other classes by defining methods that subclasses must implement.
  2. Step 2: Analyze options

    Only 'To define methods that must be implemented by subclasses' correctly states this purpose. The other options describe incorrect uses.
  3. Final Answer:

    To define methods that must be implemented by subclasses -> Option D
  4. Quick Check:

    Abstract base class = method template [OK]
Hint: Abstract base classes require method implementation [OK]
Common Mistakes:
  • Thinking abstract classes can be instantiated
  • Confusing abstract classes with regular classes
  • Believing abstract classes store data only
2. Which of the following is the correct way to declare an abstract method in a Python abstract base class?
easy
A. @abstractmethod\ndef method(self): pass
B. @abstract\ndef method(self): pass
C. def abstract method(self): pass
D. def method(self): pass

Solution

  1. Step 1: Recall abstract method syntax

    In Python, abstract methods are decorated with @abstractmethod from the abc module.
  2. Step 2: Match options with correct syntax

    Only '@abstractmethod\ndef method(self): pass' uses @abstractmethod decorator correctly. 'def method(self): pass' misses the decorator, '@abstract\ndef method(self): pass' uses a wrong decorator name, and 'def abstract method(self): pass' uses invalid syntax.
  3. Final Answer:

    @abstractmethod\ndef method(self): pass -> Option A
  4. Quick Check:

    Use @abstractmethod decorator [OK]
Hint: Use @abstractmethod decorator for abstract methods [OK]
Common Mistakes:
  • Omitting the @abstractmethod decorator
  • Using wrong decorator names
  • Writing invalid method definitions
3. What will be the output of this code?
from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        pass

class Dog(Animal):
    def sound(self):
        return "Bark"

print(Dog().sound())
medium
A. Bark
B. TypeError
C. None
D. AttributeError

Solution

  1. Step 1: Understand abstract base class behavior

    The abstract method sound must be implemented in subclass Dog. Here, Dog provides the implementation returning "Bark".
  2. Step 2: Predict output of print statement

    Creating Dog() instance is allowed because all abstract methods are implemented. Calling sound() returns "Bark" which is printed.
  3. Final Answer:

    Bark -> Option A
  4. Quick Check:

    Implemented abstract method returns 'Bark' [OK]
Hint: Subclass must implement all abstract methods to instantiate [OK]
Common Mistakes:
  • Expecting error despite full implementation
  • Confusing abstract method with normal method
  • Thinking abstract base class can be instantiated
4. Identify the error in this code snippet:
from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def move(self):
        print("Moving")

class Car(Vehicle):
    pass

car = Car()
medium
A. No error, code runs fine
B. TypeError: Can't instantiate abstract class Car with abstract method move
C. SyntaxError due to missing method implementation
D. AttributeError: 'Car' object has no attribute 'move'

Solution

  1. Step 1: Check abstract method implementation

    The abstract method move in Vehicle is decorated but has a body. However, Car does not implement move.
  2. Step 2: Understand instantiation rules

    Since Car lacks implementation of abstract method move, Python raises a TypeError when trying to create Car().
  3. Final Answer:

    TypeError: Can't instantiate abstract class Car with abstract method move -> Option B
  4. Quick Check:

    Missing abstract method implementation causes TypeError [OK]
Hint: All abstract methods must be implemented before instantiation [OK]
Common Mistakes:
  • Assuming abstract methods with body are implemented
  • Trying to instantiate subclass without method override
  • Confusing SyntaxError with TypeError here
5. You want to create an abstract base class Shape with an abstract method area. Then, create two subclasses Circle and Square that implement area. Which code correctly achieves this?
hard
A. from abc import ABC class Shape(ABC): def area(self): pass class Circle(Shape): def area(self): return 3.14 * self.r ** 2 class Square(Shape): def area(self): return self.s * self.s
B. class Shape: def area(self): pass class Circle(Shape): def area(self): return 3.14 * self.r ** 2 class Square(Shape): def area(self): return self.s * self.s
C. from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass class Circle(Shape): def __init__(self, r): self.r = r def area(self): return 3.14 * self.r ** 2 class Square(Shape): def __init__(self, s): self.s = s def area(self): return self.s * self.s
D. from abc import ABC, abstractmethod class Shape(ABC): def area(self): pass class Circle(Shape): def area(self): return 3.14 * self.r ** 2 class Square(Shape): def area(self): return self.s * self.s

Solution

  1. Step 1: Check abstract base class definition

    from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass class Circle(Shape): def __init__(self, r): self.r = r def area(self): return 3.14 * self.r ** 2 class Square(Shape): def __init__(self, s): self.s = s def area(self): return self.s * self.s correctly imports ABC and abstractmethod, defines Shape as abstract with @abstractmethod on area.
  2. Step 2: Verify subclass implementations

    Both Circle and Square implement area properly, allowing instantiation.
  3. Step 3: Analyze other options

    The other options miss the @abstractmethod decorator or do not inherit from ABC properly, so they are not true abstract base classes.
  4. Final Answer:

    from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass class Circle(Shape): def __init__(self, r): self.r = r def area(self): return 3.14 * self.r ** 2 class Square(Shape): def __init__(self, s): self.s = s def area(self): return self.s * self.s -> Option C
  5. Quick Check:

    Use ABC and @abstractmethod for abstract base classes [OK]
Hint: Use ABC and @abstractmethod to enforce method implementation [OK]
Common Mistakes:
  • Not using @abstractmethod decorator
  • Not inheriting from ABC
  • Defining abstract methods without decorator