multiple method python inheritance method-overriding

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 .