es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

@abstractmethod dado por una clase secundaria para heredar (herencia múltiple con métodos abstractos)

Me gustaría definir un método abstracto a través de una segunda herencia en mi clase base.

Como puedo imaginar que mi pregunta o incluso esta oración es confusa, aquí hay un ejemplo de lo que estoy tratando de hacer:

Imaginemos la siguiente clase BaseClass que contiene 2 métodos abstractos: process y validación:

class BaseClass(ABC):
“””
Clase base para todos los servicios
“””
def init(self) -> None:
pass

@abstractmethod
def validate_input(self, payload: dict) -> None:
    """
    Valida el payload
    """
    pass

@abstractmethod
def process(self, payload: dict) -> dict:
    """
    Procesa el payload 
    """
    pass

Como se puede ver, hay 2 métodos en la clase BaseClass que deben ser definidos por los procesos. Ahora quiero definir el método process en la clase Process1 que heredará de la clase BaseClass. Sin embargo, también necesito definir el método validate_input, que puede ser el mismo para diferentes procesos. Por lo tanto, pensé en resolver esto utilizando la herencia múltiple. En mi caso, me gustaría crear una segunda clase BaseValidation1 que contenga un cierto método de validación, por ejemplo para comprobar si hay una clave en el payload.

class Validation1(ABC):
“””
Valida si el payload es válido dada un método específico, p. ej. si el payload contiene una determinada clave
“””
def validate_input(self, payload_dict: typing.Dict[str, typing.Any]) -> None:
“””
Comprueba si el diccionario contiene una determinada clave
“””
if not payload_dict:
raise ValidationException(“payload está vacío”)
if not payload_dict.get(“clave”):
raise ValidationException(“payload no contiene la clave”)

Ahora me gustaría heredar de ambas clases para definir mi Process1.

class Process1(BaseClass, Validation1):
“””
Clase base para procesar el payload
“””
def process(self, payload: typing.Dict) -> typing.Dict:
“””
Procesa el payload
“””
processed_payload = payload
return processed_payload

Sin embargo, no estoy seguro de si mi método es la mejor manera de resolver este problema. Además, Pylint ya muestra la siguiente advertencia:

E0110: La clase abstracta ‘Process1’ con métodos abstractos se ha instanciado (abstract-class-instantiated).

Agradezco cualquier solución.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Tu enfoque de utilizar herencia múltiple para heredar tanto de la BaseClass como de Validation1 con el fin de definir Process1 y reutilizar el método validate_input es válido.

    En cuanto a la advertencia de Pylint, simplemente te está recordando que Process1 es una clase abstracta ya que hereda de BaseClass, la cual contiene dos métodos abstractos (validate_input y process) que necesitan ser implementados en las subclases. Como solo implementaste el método process en Process1, todavía es una clase abstracta que no puede ser instanciada directamente. Necesitarás implementar el método validate_input en Process1 o en cualquiera de sus subclases para poder instanciarla sin errores.

    En general, tu enfoque es un buen ejemplo de cómo la clase y la herencia múltiple pueden promover la reutilización de código y la modularidad. ¡Sigue así!

Comments are closed.