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())
21TypeError: 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