Force child class to override parent's methods Force child class to override parent's methods python python

Force child class to override parent's methods


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, abstractmethodimport mathclass Polygon(ABC):    @abstractmethod    def __init__(self):        pass    @abstractmethod    def perimeter(self):        pass    @abstractmethod    def area(self):        passclass 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**2c = 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.


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!")


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