Force child class to override parent's methods

前端 未结 3 1947
庸人自扰
庸人自扰 2020-12-12 22:03

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

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

    def perimeter(self):
        pa         


        
相关标签:
3条回答
  • 2020-12-12 22:15

    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 ABCMeta, abstractmethod
    # simpler alternative: from abc import ABC, abstractmethod
    import math
    
    class Polygon(metaclass=ABCMeta):
    # simpler alternative: 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.

    0 讨论(0)
  • 2020-12-12 22:19

    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!")
    
    0 讨论(0)
  • 2020-12-12 22:27

    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

    0 讨论(0)
提交回复
热议问题