Herencia condicional en Python

Ocurre la mayoría de las veces que, dada una condición, debemos decidir si una clase en particular debe heredar una clase o no, por ejemplo, dada una persona, si él / ella es elegible para una admisión en una universidad solo entonces debería ser un estudiante de lo contrario, no deberían ser estudiantes.

Consideremos un ejemplo, donde dada una condición, queremos que una clase (digamos C) herede dinámicamente de la clase A o la clase B. Necesitamos crear dos clases diferentes C_A y C_B, que heredan de A y B respectivamente. Sin embargo, si la herencia condicional es heredar o no según una condición, entonces podemos usar un enfoque diferente como se explica a continuación

Ejemplo 1: Herencia condicional entre 2 clases:

Cree dos clases C_A y C_B y, según la condición, devuelva el objeto de clase respectivo.

Python3

class A(object): 
    def __init__(self, x): 
        self.x = x
      
    def getX(self): 
        return self.X
    
class B(object): 
    def __init__(self, x, y): 
        self.x = x
        self.y = y
    def getSum(self): 
        return self.X + self.y
  
# inherits from A  
class C_A(A):
    def isA(self):
        return True
      
    def isB(self):
        return False
  
# inherits from B  
class C_B(B):
    def isA(self):
        return False
    
    def isB(self):
        return True
  
# return required Object of C based on cond  
def getC(cond):
    if cond:
        return C_A(1)
    else:
        return C_B(1,2)
  
# Object of C_A
ca = getC(True)
print(ca.isA())
print(ca.isB())  
    
# Object of C_B  
cb = getC(False)
print(cb.isA())
print(cb.isB())

Producción:

True
False
False
True

Ejemplo 2: para heredar o no de A:

El enfoque es usar declaraciones condicionales mientras se declaran las clases que hereda la clase C dada. El siguiente código se ejecuta y devuelve True

Python3

class A(object): 
    def __init__(self, x): 
        self.x = x
      
    def getX(self): 
        return self.X
  
# Based on condition C inherits 
# from A or it inherits from 
# object i.e. does not inherit A
cond = True  
  
# inherits from A or B
class C(A if cond else object):
    def isA(self):
        return True
  
# Object of C_A
ca = C(1)
print(ca.isA())

Producción:

True

Ejemplo 3: el siguiente código no se ejecutará, ya que C no hereda de A, por lo que tiene un constructor predeterminado que no acepta ningún argumento

Python3

class A(object): 
    def __init__(self, x): 
        self.x = x
      
    def getX(self): 
        return self.X
  
# Based on condition C inherits from
# A or it inherits from object i.e.
# does not inherit A
cond = False
  
## inherits from A or B
class C(A if cond else object):
    def isA(self):
        return True
  
# Object of C_A
ca = C(1)
print(ca.isA())

Producción:

TypeError Traceback (última llamada más reciente)
<ipython-input-16-f0efc5a814d9> en <módulo>
    17
    18 # Objeto de C_A
—> 19 ca = C(1)
    20 print(ca.isA())
    21

TypeError: object() no toma parámetros

Publicación traducida automáticamente

Artículo escrito por suchetaggarwal4 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *