2017-06-15 137 views
8

假设我有一个未实现的方法一个基类如下:强制子类覆盖父的方法

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

    def perimeter(self): 
     pass 

    def area(self): 
     pass 

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

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

回答

16

这可能是你的父类:

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 2 * math.pi * self.radius 


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

2

这是NotImplementedError使用究竟什么:)

在你的基类