强制子类覆盖父方法

时间:2017-06-15 20:08:52

标签: python inheritance method-overriding

假设我有一个带有未实现方法的基类,如下所示:

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

    def perimeter(self):
        pass

    def area(self):
        pass

现在,让我们说我的一位同事使用Polygon类创建一个子类,如下所示:

import math

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

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

(H / Sh)e忘记实现area()方法。

如何强制子类实现parent的area()方法?

3 个答案:

答案 0 :(得分:54)

这可能是你的父类:

class Polygon():
    def __init__(self):
        raise NotImplementedError

    def perimeter(self):
        raise NotImplementedError

    def area(self):
        raise NotImplementedError

虽然问题只会在运行时发现,但是当其中一个子类的实例尝试调用其中一种方法时。

另一个版本是使用abc.abstractmethod

from abc import ABCMeta, abstractmethod
import math

class Polygon(metaclass=ABCMeta):

    @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

如果没有实施所有方法,您将无法实例化Circle

这是python 3语法;在python 2您需要

class Polygon(object):
    __metaclass__ = ABCMeta

另请注意,对于二进制特殊函数__eq__(), __lt__(), __add__(), ...,最好return NotImplemented而不是提升NotImplementedError

答案 1 :(得分:3)

确切地说NotImplementedError用于:)

在您的基类

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

答案 2 :(得分:2)

您可以在基类方法中引发NotImplementedError异常。

class Polygon:
    def area(self):
        raise NotImplementedError

此外,您可以使用@abc.abstractmethod,但是您需要将元类声明为abc.ABCMeta,这将使您的类抽象化。有关abc module

的更多信息