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