I have a question on multi level inheritance. I am trying to write classes of the form:
from abc import ABC, abstractmethod import numpy as np ### Parent class class A(ABC): @abstractmethod def eval(self, x: np.ndarray) -> np.ndarray: pass @abstractmethod def func(self, x: np.ndarray) -> None: pass ### 1. Inheritance class B1(A): def eval(self, x: np.ndarray) -> np.ndarray: #do something here return np.zeros(5) @abstractmethod def func(self, x: np.ndarray) -> None: pass class B2(A): def eval(self, x: np.ndarray) -> np.ndarray: #do something different here return np.zeros(10) @abstractmethod def func(self, x: np.ndarray) -> None: pass ### 2. Inheritance class C1(B1): def func(self, x: np.ndarray) -> None: print('child1.1') class C2(B1): def func(self, x: np.ndarray) -> None: print('child1.2') class C3(B2): def func(self, x: np.ndarray) -> None: print('child2.1') c1 = C1() c2 = C2() c3 = C3()
I am not planning on instantiating A
B1
or B2
.
My question is, if this is the correct way to go about this in python? I want to make it clear that Bx
are still abstract classes
Advertisement
Answer
Its quite simple. If class A
defines some abstract methods, then any other class which inherits from A
also inherits these methods. Not need to reimplement as abstract methods.
In your case your Bx
classes only need their specialised implementations of eval()
. They don’t need func()
since they already inherit them.