Setting Class variable as function Polymorphism

i am trying to set a variable as a function so that it it can be like a menu … basically allow for polymorphism

@jitclass()
class LeverageLong:
leverage_calculator: None

def __init__(
    self,
    leverage_type: int,
):
    if leverage_type == 0:
        self.leverage_calculator = self.set_static_leverage
    elif leverage_type == 1:
        self.leverage_calculator = self.calculate_dynamic_leverage
    self.leverage_calculator = self.calculate_dynamic_leverage

def set_static_leverage(
    self,
):
    return 1

def calculate_dynamic_leverage(
    self,
):
    return 9

then i should be able to do something like
lev = LeverageLong(1)

lev.leverage_calculator()

but it is saying the class member isn’t supported … does anyone know how to make something like this work in numba?

I think you’d have to store the selected value then dispatch based on it in a function, like:

from numba import njit
from numba.experimental import jitclass


@jitclass()
class LeverageLong:
    leverage_type: int

    def __init__(self, leverage_type: int):
        self.leverage_type = leverage_type

    def leverage_calculator(self):
        if self.leverage_type == 0:
            return self.calculate_static_leverage()
        elif self.leverage_type == 1:
            return self.calculate_dynamic_leverage()

    def calculate_static_leverage(self):
        return 1

    def calculate_dynamic_leverage(self):
        return 9


@njit
def f(leverage_type):
    lev = LeverageLong(leverage_type)
    return lev.leverage_calculator()


print(f(1))
print(f(0))

ok thank you for this … but the problem is that i want to run this through a loop of lets say 10 example below … when i do this when i turn numba off it is always checking in the if statement … so the way i would like this to work is that it only checks the if statement one time then instantly executes the dynamic leverage if i had one as the leverage type … do you know how to make it do that ?

@jitclass()
class LeverageLong:
leverage_type: int

def __init__(self, leverage_type: int):
    self.leverage_type = leverage_type

def leverage_calculator(self):
    if self.leverage_type == 0:
        return self.calculate_static_leverage()
    elif self.leverage_type == 1:
        return self.calculate_dynamic_leverage()

def calculate_static_leverage(self):
    return 1

def calculate_dynamic_leverage(self):
    return 9

lev = LeverageLong(1)
for i in range(10):
# print(“hello”)
print(lev.leverage_calculator())

the way this is working is that it goes and does the if statement all 10 times if you don’t have numba on … but i don’t want it to do it that way

here is an example of how this works perfectly … only calls the if statement once

@jitclass()
class LeverageLong:
leverage_calculator: None

def __init__(self, leverage_type: int):
    if leverage_type == 0:
        self.leverage_calculator = self.set_static_leverage
    elif leverage_type == 1:
        self.leverage_calculator = self.calculate_dynamic_leverage

def set_static_leverage(self):
    print(1)

def calculate_dynamic_leverage(self):
    print(9)

tester = LeverageLong(1)
for i in range(10):
tester.leverage_calculator()