2017-06-15 58 views
8

Załóżmy, że mam klasę bazową z metod ZAIMPLEMENTOWANE następująco:Siła klasa dziecko przesłonić metody rodzica

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

    def perimeter(self): 
     pass 

    def area(self): 
     pass 

Teraz, powiedzmy, że jeden z moich kolegów używa klasy Polygon utworzyć podklasę następująco:

import math 

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

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

(H/Sh) e zapomniało zaimplementować metodę area().

Jak wymusić na podklasie implementację metody area() rodzica?

Odpowiedz

16

to może być twoja klasa dominująca:

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

    def perimeter(self): 
     raise NotImplementedError 

    def area(self): 
     raise NotImplementedError 

chociaż problem będzie wykryte tylko w środowisku wykonawczym, gdy jedno z wystąpień klas potomnych próbuje wywołać jedną z tych metod.


inną wersją jest użycie 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 

nie będzie w stanie instancji Circle bez konieczności to wszystkie metody zaimplementowane.

jest to składnia python 3; w python 2 trzeba by

class Polygon(object): 
    __metaclass__ = ABCMeta 

także pamiętać, że dla binarnych funkcji specjalnych __eq__(), __lt__(), __add__(), ... lepiej jest return NotImplemented zamiast podnoszenia NotImplementedError.

2

To właśnie NotImplementedError służą do :)

W swojej klasie bazowej