假设我有一个带有未实现方法的基类,如下所示:
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] 删除。
我来说两句