Let’s say I have two classes with some methods.
First class:
@dataclass
class MyFirstClass:
y1: List[float]
y2: List[float]
@property
def my_func1(self) -> List[float]:
return self.y1-self.y2
@property
def my_func2(self) -> List[float]:
return self.y1+self.y2
@property
def my_func3(self) -> List[float]:
return self.y1*self.y2
Second class:
@dataclass
class MySecondClass:
list_vals: List[float]
@property
def norm1(self):
return self.list_vals
@property
def norm2(self):
return self.list_vals / numpy.mean(self.list_vals)
So my question is two fold.
Say in my main I have something like:
def main():
FUNCTION = <?>
NORM = <?>
y1 = [1, 2, 3, 4, 5]
y2 = [3, 4, 5, 6, 7]
test = MyFirstClass(y1, y2).my_func1
Then I just call MyFirstClass with the y1 and y2 lists and get an output.
But as can be seen in the beginning of main I have FUNCTION and NORM. Is there any way to call MyFirstClass from there, and then reuse it all through main, i.e. something like:
FUNCTION = MyFirstClass.my_func1 test = FUNCTION(y1, y2)
This doesn’t work obviously. So how can one do that ?
Also, and this is probably a build upon the above, how can I, once again, choose the norm function to be used in the other class ? For instance, if I update MyFirstClass a bit to:
@dataclass
class MyFirstClassUpdated:
y1: List[float]
y2: List[float]
norm: NORM
@property
def my_func1(self) -> List[float]:
return norm(self.y1)-norm(self.y2)
@property
def my_func2(self) -> List[float]:
return norm(self.y1)+norm(self.y2)
@property
def my_func3(self) -> List[float]:
return norm(self.y1)*norm(self.y2)
And then when the class is called it takes the NORM argument from the main function, i.e. something like:
FUNCTION = MyFirstClass.func1 NORM = MySecondClass.norm1 test = FUNCTION(y1, y2, NORM)
I have no idea if this is even possible without making the code “uglier”.
Advertisement
Answer
You need to create an instance of MyFirstClass, and pass it as the self argument to the function.
FUNCTION = MyFirstClass.my_func1 mfc = MyFirstClass(y1, y2) test = FUNCTION(mfc)