python - method - Forzar a la clase infantil a anular los métodos de los padres
python super inheritance (3)
Supongamos que tengo una clase base con métodos no implementados de la siguiente manera:
class Polygon():
def __init__(self):
pass
def perimeter(self):
pass
def area(self):
pass
Ahora, digamos que uno de mis colegas usa la clase Polygon para crear una subclase de la siguiente manera:
import math
class Circle(Polygon):
def __init__(self, radius):
self.radius = radius
def perimeter(self):
return 2 * math.pi * self.radius
(H / Sh) e ha olvidado implementar el método area ().
¿Cómo puedo forzar la subclase para implementar el método area () de los padres?
Eso es exactamente para lo que se usa NotImplementedError
:)
En tu clase base
def area(self):
raise NotImplementedError("Hey, Don''t forget to implement the area!"
Puede aumentar la excepción NotImplementedError
en el método de clase base.
class Polygon:
def area(self):
raise NotImplementedError
También puede usar abc.abstractmethod , pero luego debe declarar que metaclass es abc.ABCMeta
, lo que haría que su clase sea abstracta. Más sobre el módulo abc
esta podría ser tu clase padre
class Polygon():
def __init__(self):
raise NotImplementedError
def perimeter(self):
raise NotImplementedError
def area(self):
raise NotImplementedError
aunque el problema se detectará solo en tiempo de ejecución, cuando una de las instancias de las clases secundarias intente llamar a uno de estos métodos.
una versión diferente es utilizar 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 math.pi * self.radius**2
c = Circle(9.0)
# TypeError: Can''t instantiate abstract class Circle with abstract methods area
no podrá crear una instancia de un Circle
sin tener todos los métodos implementados.
esta es la sintaxis de python 3
; en python 2
necesitarías
class Polygon(object):
__metaclass__ = ABCMeta
también tenga en cuenta que para las funciones especiales binarias __eq__(), __lt__(), __add__(), ...
es mejor return NotImplemented
lugar de aumentar NotImplementedError
.