Home Resource Centre Method Overriding In Python | All Concepts Explained With Examples

Python Programming Table of content:

Method Overriding In Python | All Concepts Explained With Examples

The ability to inherit behaviors and attributes is a critical part of object-oriented programming (OOP) concepts, making languages versatile. It empowers developers to modify the behavior of some methods while working on a base definition. This concept, called method overriding in Python, allows subclasses to provide specific implementations of methods already defined in their parent classes. It facilitates more specialized and adaptable code structures.

In this article, we will explore the intricacies of method overriding in Python, exploring its foundational principles, implementation techniques, and practical applications. Whether you're a budding programmer or an experienced developer, understanding method overriding is essential for crafting efficient and maintainable Python code.​

What Is Method Overriding In Python?

Method overriding in Python language refers to the process where a subclass (child class) provides a specific implementation of a method that is already defined in its superclass (parent class) it inherits from. This allows the subclass to modify or extend the behavior of that method to suit its specific needs.​

Real-Life Analogy

Consider a general blueprint for a vehicle provided by a manufacturer, detailing standard features like starting the engine or applying brakes. 

  • Now, imagine a sports car manufacturer using this blueprint but customizing the engine start method to include a unique ignition sequence. 
  • Here, the sports car manufacturer is overriding the standard engine start method to provide a specialized behavior, much like how subclasses override methods in Python to tailor functionalities.

How Method Overriding Works in Python: Behind the Scenes

Here is a step-by-step breakdown of method overriding in Python operates internally:​

Step 1: Class Definition and Inheritance

When a class is defined, Python creates a namespace for it, storing its attributes and methods. If a subclass inherits from a superclass, Python constructs a Method Resolution Order (MRO) for the subclass, determining the sequence in which base classes are searched when executing a method.​

Step 2: Method Lookup

When a method is called on an instance, Python follows this procedure:​

  1. Instance's Class: Python first checks if the method exists in the instance's class.​
  2. MRO Sequence: If not found, Python traverses the classes in the MRO sequence, searching for the method.​
  3. First Match Execution: The first occurrence of the method in this sequence is executed.​

This dynamic lookup allows subclasses to override methods from superclasses by defining a method with the same name.

Step 3: Overriding Mechanism (Dynamic Method Resolution/ Runtime Behavior)

When a subclass defines a method with the same name as one in its superclass, the subclass's method overrides the superclass's method. 

  • This means that calls to this method on subclass instances will execute the subclass's version, effectively replacing the superclass's implementation for those instances.​
  • Note that Python determines which method to execute at runtime based on the object's class. This dynamic behavior allows for flexible and extensible code structures.

Step 4: Accessing Superclass Methods

To access the overridden method from the superclass within the subclass, Python provides two approaches:​

  • Direct Class Reference: Calling the method using the superclass's name.​
  • super() Function: Utilizing the super() function, as it returns a proxy object to delegate the method calls to the superclass.

The super() function is particularly beneficial in multiple inheritance scenarios, as it adheres to the MRO, ensuring the correct method is called.​ We will discuss both of these in a later section.

Code Example:

Output:

The animal makes a sound.
The dog barks.

Explanation:

In this example, the Dog class (subclass) overrides the speak() method from the Animal class (superclass). Within the overridden method, it calls super().speak() to execute the superclass's version before adding its own behavior.​

Quick Knowledge Check!

  QUIZZ SNIPPET IS HERE

Features/Rules Of Method Overriding In Python

Method overriding in Python is a fundamental concept that allows a subclass to provide a specific implementation of a method already defined in its superclass. This mechanism is pivotal for achieving polymorphism and customizing inherited behaviors. Below are the key features and rules that govern method overriding in Python:​

  1. Inheritance is Mandatory: Method overriding necessitates an inheritance relationship between classes. A subclass must inherit from a superclass to override its methods. Without inheritance, method overriding is not applicable.
  2. Method Signature Consistency: The overriding method in the subclass (child) must have the same name and parameters as the method in the superclass (parent). This consistency ensures that the method call behaves as expected when invoked on subclass instances.​
  3. Dynamic Method Resolution: Python employs dynamic method resolution, meaning that the method to execute is determined at runtime based on the object's class. This allows for flexible and dynamic behavior in object-oriented programs.​
  4. Using super() Function for Parent Method Access: The super() function in Python allows a subclass to call a method from its superclass. This is particularly useful when the subclass wants to extend or modify the behavior of the superclass method rather than completely replacing it.​
  5. Overriding Methods Should Not Be More Restrictive: While Python does not enforce access modifiers like some other languages, it's considered good practice that the overriding method in the subclass does not have more restrictive access than the method in the superclass. This ensures that the method remains accessible where it's expected to be.​
  6. Return Type Considerations: Although Python is dynamically typed and does not enforce return types, maintaining consistent return types between the superclass and subclass methods is advisable. This consistency helps prevent unexpected behaviors and enhances code readability.
  7. Overriding Static Methods: In Python, static methods can be overridden in subclasses. However, since static methods are not bound to class instances, overriding them should be done with caution, ensuring that the new implementation aligns with the intended use.​
  8. Overriding Class Methods: Class methods, marked with the @classmethod decorator, can also be overridden in subclasses. When doing so, it's essential to maintain the method's signature and ensure that the overriding method appropriately handles the class reference (cls).

Check out this amazing course to become the best version of the Python programmer you can be.

Implementation Of Method Overriding In Python With Examples

We already know that method overriding is fundamental to achieving polymorphism and customizing inherited behaviors. There are several approaches to implementing method overriding in Python programs. Let’s take a look at them with examples.

1. Using the Parent Class Name

One straightforward way to access the parent class's method within an overridden method is to directly invoke it using the parent class's name.​ By explicitly calling the superclass's method using its name, you can invoke the original implementation, allowing you to extend or modify its behavior in the subclass.

Code Example:

Output:

Inside Parent
Inside Child

Explanation:

In this example, we define a base class called Parent that contains a method called show(), which prints the string value “Inside Parent”.

  • Then, we define another class, Child, which inherits from Parent
  • This class overrides the show() method of the Parent class. 
  • Within this overriding method, it explicitly calls Parent.show(self) to execute the parent class's version before executing its own additional code.
  • We then create an instance of the Child class called obj and use it to call the show() method.
  • The function call invokes the show() method from the Child class. Given the function definition, both the Parent class and Child class methods are executed, printing two statements to the console.
  • This shows how the Child class method overrides the show() method from the Parent class.

2. Using the super() Function

Python's built-in function super() provides a flexible way to call methods from a superclass, which is especially beneficial in multiple inheritance scenarios.​ 

  • The super() function returns a proxy object that delegates method calls to a parent or sibling class of the type. 
  • This approach adheres to the MRO (discussed in a later section), ensuring that the correct method is called, which is particularly useful when dealing with complex class hierarchies.​

Code Example:

Output:

Inside Parent
Inside Child

Explanation:

Here, we define the same two classes, Parent and Child as above. 

  • But here, inside the overriding function of the Child class, we use the super() function to call show(). 
  • So super().show() calls the show() method from the superclass (Parent)
  • This approach is preferred over directly using the parent class name as it adheres to the method resolution order (MRO) and is more adaptable to changes in the class hierarchy.

3. Overriding Methods with Default Parameters Default, Optional, and Keyword Arguments

While the class name and super() methods are commonly used for method overriding, Python also allows method overriding using the concepts of default, optional, and keyword arguments. When we define methods using default parameters and keyword arguments in the superclass, it allows the child class to override the method by customizing the method's behavior to handle different argument combinations.​ Look at the example below to see how this can be done.

Code Example:

Output:

Welcome, User!
Welcome, Shivani!

Explanation:

  • In the Parent class, we define a function called greet(), which uses the print() function with f-string method to display a message.
  • The Child class overrides the greet() method of the Parent class.
  • The greet() method in the Child class has a default parameter name="User".
  • When child.greet() is called without an argument, the default value "User" is used.
  • When child.greet("Shivani") is called with an argument, the provided value "Shivani" overrides the default value.​

This example demonstrates how method overriding works in Python, with the subclass providing a specific implementation of the method. The use of default arguments allows the method to handle different numbers of arguments, simulating method overloading behavior.​

Looking for guidance? Find the perfect mentor from select experienced coding & software development experts here.

Method Overriding In Python With Multiple Inheritance

Multiple inheritance in Python is when a child class (subclass) inherits attributes and methods from more than one parent class (superclasses). This enables a child class to combine functionalities from multiple sources, promoting code reuse and modularity.​

In the diagram above, ChildClass inherits from both ParentClass1 and ParentClass2, gaining access to their attributes and methods.

How Method Overriding Works with Multiple Inheritance

When a subclass inherits from multiple parent classes, it can override methods from any of those parent classes. This allows it to customize or extend the behavior of methods inherited from multiple sources.​

  • For instance, say a Child class inherits from both Parent1 and Parent2, each having a greet() method. 
  • The Child class can override the greet() method to provide its own implementation. 
  • When an instance of Child calls greet(), Python will invoke the overridden method in Child, not the ones in Parent1 or Parent2. 
  • This allows the Child class to define its own behavior, even when inheriting from multiple classes.​

It's important to note that if the Child class does not override the greet method, Python will look for the method in the parent classes. If both Parent1 and Parent2 have a greet method, Python will follow the Method Resolution Order (MRO) to determine which method to call. We will discuss what this means after this code example.

Code Example:

Output:

Hello from Child

Explanation:

  • The Child class inherits from both Parent1 and Parent2.
  • The greet() method is defined in both parent classes and is overridden in the Child class.
  • When child.greet() is called, Python invokes the greet() method in the Child class, as it takes precedence over the parent classes.

Order of Resolution for Method Overriding in Python

The Method Resolution Order (MRO) is a mechanism that Python uses to decide the order in which base classes are searched when executing a method. This order is crucial in multiple inheritance scenarios to ensure that the correct method is called.​

  • Python determines the MRO using the C3 Linearization algorithm, ensuring a consistent and predictable method lookup order. 
  • The C3 algorithm linearizes the class hierarchy by considering the following rules:
    1. Child classes precede their parent classes: A class should appear before its parents in the MRO.​
    2. Parent classes are considered in the order specified in the inheritance list: The order in which parent classes are listed in the class definition affects the MRO.​
    3. Consistency with the MRO of parent classes: The MRO of a class must be consistent with the MROs of its parents.​

By following these rules, Python ensures that the MRO is consistent and that the method lookup order is predictable. This is particularly important in complex inheritance hierarchies to avoid ambiguity and ensure that the correct method is called.​ For example, consider the diagram below and the explanation that follows:

  • The D class inherits from both classes B and C.
  • The greet method is defined in all classes (A, B, and C).
  • Python determines the method resolution order using the C3 linearization algorithm, resulting in the MRO: D -> B -> C -> A.
  • When d.greet() is called, Python searches for the greet method in the MRO and finds it in B, so it invokes B's greet method.

Pro tip: You can view the MRO of a class using the mro() method:​

print(D.mro())

This will display the method resolution order for class D, showing the sequence in which Python will search for methods.

Quick Knowledge Check!

  QUIZZ SNIPPET IS HERE

Ready to upskill your Python game? Dive deeper into actual problem statements and elevate your coding game with hands-on practice!

Method Overriding In Python With Multilevel Inheritance

Multilevel inheritance in Python occurs when a class inherits from another child class, which itself inherits from a parent class. 

  • This creates a linear chain of inheritance across multiple generations. 
  • Method overriding in such hierarchies allows each subclass to modify or refine behaviors defined in its ancestor classes, promoting flexibility, code reuse, and the ability to specialize functionalities at different levels.

In simple terms, multilevel inheritance forms a chain like this:

Grandparent → Parent → Child

Each class in this chain can define or override methods, enabling child classes to tailor or extend inherited functionalities as needed.

How Method Overriding Works with Multilevel Inheritance

In a multilevel inheritance setup:

  • A child class can override methods inherited from its immediate parent or even from the grandparent class.
  • When a method is called on an instance of the child class, Python first looks for the method in the child class itself.
  • If the method is not found there, Python continues searching up the inheritance chain, moving to the parent, then the grandparent, and so on.
  • The method found first in this sequence is executed.

This straightforward lookup mechanism ensures that the most specific implementation of a method is executed, allowing subclasses to customize or completely replace behaviors inherited from their ancestors.

Code Example:

Output:

Inside Child

Explanation:

  • The Child class overrides the show() method originally defined in the Grandparent class and redefined in the Parent class.
  • We then create an object of the Child class, obj, and use it to call the show() method.
  • When obj.show() is called, Python finds the show() method in the Child class itself and executes it.
  • Python does not need to search further up the inheritance chain because the method was found at the child level.

Thus, the most immediate method definition takes precedence in the method lookup process.

Using super() in Multilevel Inheritance

In multilevel inheritance, you can also use the super() function to call a method from the immediate parent class. This allows a subclass to extend or build upon the behavior of its superclass rather than completely replacing it.

By chaining super() calls, you can create a cascading flow where methods from multiple ancestor classes are executed in sequence.

Code Example:

Output:

Inside Grandparent
Inside Parent
Inside Child

Explanation:

  • The Child class overrides the show() method but first calls super().show(), which triggers the show() method in the Parent class.
  • The Parent class, in turn, calls super().show(), which triggers the show() method in the Grandparent class.
  • This results in a cascading execution starting from the Grandparent, then the Parent, and finally the Child.

This approach ensures that each class in the inheritance chain can contribute its behavior without completely replacing that of its ancestors.

Pro Tip: Using super() helps maintain clean and modular code, especially when working with deep inheritance chains. It ensures that all necessary initializations or behaviors defined in ancestor classes are properly executed, making the code more predictable and easier to maintain.

Method Overloading In Python

Method overloading refers to the ability of a class to have multiple methods with the same name but different parameters, i.e., differing by the number or type of arguments. 

  • In many programming languages, such as Java and C++, method overloading is natively supported through compile-time polymorphism. 
  • But true method overloading is not supported in Python in the traditional sense.
  • In Python, if you define multiple methods with the same name, only the last method definition is retained, effectively overriding the earlier ones.
  • It, however, offers a way to simulate method overloading by using default parameters, variable-length arguments (*args, **kwargs), and type-checking within methods.

This dynamic approach gives developers the flexibility to create methods that behave differently based on the number or type of arguments passed.

Example of Simulated Method Overloading in Python:

Explanation:

  • The add() method can accept 1, 2, or 3 arguments because of default parameters.
  • Depending on how many arguments you pass, it calculates the sum accordingly.
  • This flexibility simulates method overloading in Python without requiring multiple method definitions.

Difference Between Method Overloading and Method Overriding in Python

Although method overloading and method overriding both relate to methods and polymorphism, they serve different purposes and behave differently in Python. Here's a quick comparison:

Feature

Method Overloading

Method Overriding

Definition

Defining multiple methods with the same name but different parameters within the same class.

Defining a method in a subclass that replaces a method from the parent class.

Purpose

Perform different tasks based on different arguments.

Modify or extend the behavior of an inherited method.

Native Support in Python

Not directly supported (must be simulated).

Fully supported via inheritance.

Location

Within the same class.

Across parent and child classes.

Example Mechanisms

Default arguments, *args, **kwargs, type checks.

Inheritance and same method name in child class.

Execution Decision

Based on number/type of arguments (manually handled).

Based on object type at runtime.

Method overloading in Python is simulated, while method overriding is natively supported and integral to Python’s object-oriented system.

Quick Knowledge Check!

  QUIZZ SNIPPET IS HERE

Common Mistakes In Method Overriding In Python

While method overriding is a powerful feature that enables flexibility and dynamic behavior in Python programs, it is also an area where beginners or even experienced developers can make mistakes. These mistakes can lead to unexpected bugs, confusing behavior, and maintenance challenges. Here’s a look at some common mistakes in method overriding in Python and how to avoid them:

1. Mismatch in Method Signature

  • Mistake: Defining the overriding method with a different name, incorrect number of parameters, or inconsistent parameter names compared to the superclass.
  • Why It’s a Problem: Python doesn’t raise an immediate error if the method signature doesn't match– it simply treats it as a new method, and overriding doesn't happen as intended.
  • Tip to Avoid: Always maintain the same method name and compatible parameters when overriding a method.

Example:

Here, calling Child().greet('Shivani') would cause a TypeError.

2. Forgetting to Call super() When Needed

  • Mistake: Overriding a method but not calling the parent class's version when part of the base functionality is still required.
  • Why It’s a Problem: You might accidentally skip important setup or logic defined in the parent method.
  • Tip to Avoid: Use super().method_name() when you want to extend behavior rather than completely replace it.

Code Example:

class Parent:
    def setup(self):
        print("Setting up base features.")
class Child(Parent):
    def setup(self):
        super().setup() #Skipping this will completely replace the functionality of the method in Parent class
        print("Adding custom features.")

3. Incorrect Use of super() in Multiple Inheritance

  • Mistake: Calling the parent method directly by class name in a multiple inheritance setup, ignoring the Method Resolution Order (MRO).
  • Why It’s a Problem: Bypassing MRO can lead to methods being skipped or executed in the wrong order, creating hard-to-trace bugs.
  • Tip to Avoid: Prefer super() over explicit parent class names when dealing with multiple inheritance.

4. Overriding Methods Without Clear Purpose

  • Mistake: Overriding methods unnecessarily without truly modifying or extending behavior.
  • Why It’s a Problem: Adds clutter, confuses other developers, and bloats the codebase without adding value.
  • Tip to Avoid: Override a method only if you intend to change or extend its behavior meaningfully.

5. Confusing Method Overriding with Method Overloading

  • Mistake: Expecting Python to automatically pick the correct method based on the number of arguments, as happens with overloading in other languages.
  • Why It’s a Problem: In Python, only the last defined method with a given name exists– earlier ones are overwritten.
  • Tip to Avoid: Simulate overloading explicitly using default values or *args, and clearly document your method behavior.

Conclusion

Method overriding in Python empowers subclasses to adapt and specialize inherited behaviors, making code more dynamic, maintainable, and scalable.

  • It forms the backbone of polymorphism, allowing objects to respond differently based on their specific class, even when accessed through a common interface.
  • Whether it's customizing functionality, extending existing logic, or enabling more flexible code structures, method overriding is a tool that drives smarter object-oriented design.
  • Understanding how and when to override methods and mastering patterns like super() usage and method resolution ensures that your Python programs stay robust and future-proof.

As you design your class hierarchies, think of method overriding in Python programs not just as a technique– but as a way to make your code truly adaptable and intelligent.

Frequently Asked Questions

Q1. How can I override methods from different parent classes selectively in a child class?

In multiple inheritance scenarios, if you want a child class to use specific methods from different parent classes, you can explicitly call the desired method from each parent.​

Code Example:

In this setup, class D inherits from both B and C. By explicitly calling B.foo(self) and C.bar(self), you can control which parent class's method is invoked.

Q2. Can I override a method without changing its behavior?

Yes, you can override a method in a subclass without altering its behavior by calling the superclass's method within the overridden method using the super() function. This is often done to extend or augment the behavior of the superclass method.​

Code Example:

Output:

Hello from Parent
Hello from Child

Q3. Is it necessary for the method signatures to match when overriding?

While Python does not enforce strict method signature matching, it's a good practice to keep the method signatures consistent when overriding. Changing the number or type of parameters can lead to unexpected behavior, especially if the method is called polymorphically.

Q4. Can I call a specific parent class's method from a subclass?

Yes, you can directly call a method from a specific parent class by referencing the parent class name and passing self as an argument. However, using super() is generally preferred as it respects the method resolution order (MRO) and is more maintainable in complex hierarchies.​

Code Example:

Output:

Hello from Parent2

Q5. What happens if a subclass does not override a method from its superclass?

If a subclass does not override a method defined in its superclass, it inherits the method as-is. In this case, when we call the method on an instance of the subclass, it actually invokes and executes the version of the method from the superclass​

Q6. Can I override special methods like __str__ or __repr__?

Yes, special methods (also known as "dunder" methods) like __str__, __repr__, __len__, etc., can be overridden in a subclass to customize their behavior. This is commonly done to provide meaningful string representations or to define how objects behave with built-in functions.​

Q7. Is it possible to prevent a method from being overridden?

Python does not have built-in support for preventing method overriding (i.e., no final keyword like in some other languages). However, by convention, methods prefixed with an underscore (e.g., _method) are considered "protected," and methods with double underscores (e.g., __method) are "private" and name-mangled to discourage overriding.

This compiles our discussion on method overriding in Python. Here are a few more topics you must explore:

Shivani Goyal
Manager, Content

An economics graduate with a passion for storytelling, I thrive on crafting content that blends creativity with technical insight. At Unstop, I create in-depth, SEO-driven content that simplifies complex tech topics and covers a wide array of subjects, all designed to inform, engage, and inspire our readers. My goal is to empower others to truly #BeUnstoppable through content that resonates. When I’m not writing, you’ll find me immersed in art, food, or lost in a good book—constantly drawing inspiration from the world around me.

TAGS
Python programming language Engineering Computer Science
Updated On: 29 Apr'25, 10:48 AM IST