Force child class to override parent's methods

PythonInheritanceOverriding

Python Problem Overview


Suppose I have a base class with unimplemented methods as follows:

class Polygon():
    def __init__(self):
        pass

    def perimeter(self):
        pass

    def area(self):
        pass

Now, let's say one of my colleagues uses the Polygon class to create a subclass as follows:

import math

class Circle(Polygon):
    def __init__(self, radius):
        self.radius = radius

    def perimeter(self):
        return 2 * math.pi * self.radius
    

(H/Sh)e has forgotten to implement the area() method.

How can I force the subclass to implement the parent's area() method?

Python Solutions


Solution 1 - Python

this could be your parent class:

class Polygon():

    def __init__(self):
        raise NotImplementedError

    def perimeter(self):
        raise NotImplementedError

    def area(self):
        raise NotImplementedError

although the problem will be spotted at runtime only, when one of the instances of the child classes tries to call one of these methods.


a different version is to use abc.abstractmethod.

from abc import ABC, abstractmethod
import math


class Polygon(ABC):

    @abstractmethod
    def __init__(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

    @abstractmethod
    def area(self):
        pass

class Circle(Polygon):
    def __init__(self, radius):
        self.radius = radius

    def perimeter(self):
        return 2 * math.pi * self.radius

#    def area(self):
#        return math.pi * self.radius**2


c = Circle(9.0)
# TypeError: Can't instantiate abstract class Circle
#            with abstract methods area

you will not be able to instantiate a Circle without it having all the methods implemented.

this is the python 3 syntax; in python 2 you'd need to

class Polygon(object):
    __metaclass__ = ABCMeta

also note that for the binary special functions __eq__(), __lt__(), __add__(), ... it is better to return NotImplemented instead of raising NotImplementedError.

Solution 2 - Python

You can raise NotImplementedError exception in base class method.

class Polygon:
    def area(self):
        raise NotImplementedError

Also you can use @abc.abstractmethod, but then you need to declare metaclass to be abc.ABCMeta, which would make your class abstract. More about abc module

Solution 3 - Python

That's exactly what NotImplementedError are used for :)

In your base class

def area(self):
    raise NotImplementedError("Hey, Don't forget to implement the area!")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAditya BarveView Question on Stackoverflow
Solution 1 - Pythonhiro protagonistView Answer on Stackoverflow
Solution 2 - Pythonvishes_shellView Answer on Stackoverflow
Solution 3 - PythonBubble Bubble Bubble GutView Answer on Stackoverflow