强制子类覆盖父类的方法

Aditya颜色:

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

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

弘主角:

这可能是您的父类:

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

    def perimeter(self):
        raise NotImplementedError

    def area(self):
        raise NotImplementedError

尽管仅在运行时才发现问题,但是当子类的实例之一试图调用这些方法之一时,问题就出现了。


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

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

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

class Polygon(object):
    __metaclass__ = ABCMeta

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章