Force child class to override parent's methods

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?

36744 次浏览

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

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

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.