强制子类覆盖父类的方法

新手上路,请多包涵

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

 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() 方法。

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

原文由 Aditya Barve 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 476
2 个回答

这可能是你的父类:

 class Polygon():

    def __init__(self):
        raise NotImplementedError

    def perimeter(self):
        raise NotImplementedError

    def area(self):
        raise NotImplementedError

虽然只有在运行时才会发现问题,但当子类的一个实例试图调用这些方法之一时。


一个不同的版本是使用 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

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

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

class Polygon(object):
    __metaclass__ = ABCMeta


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

原文由 hiro protagonist 发布,翻译遵循 CC BY-SA 4.0 许可协议

这正是 NotImplementedError 用于 :)

在你的基类

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

原文由 Bubble Bubble Bubble Gut 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题