提取并隔离Python函数,给定一个类的实例

问题描述 投票:1回答:1

假设我得到了一个Python类的实例。该类具有一个函数,我想从该类中提取并隔离该函数。最终函数需要有权访问原始类的属性值,但否则根本不应调用该类。

[我的动机是我想使用jit中的numba来编译函数,但是我不想使用jitclass来编译整个类。>

作为具体示例,请考虑以下类。理想情况下,我不想修改此代码:

class Adder:
    """
    A minimal callable class with keyword arg
    """
    def __init__(self, num=4):
        self.num = num
    def add(self, val1, val2):
        return val1 + val2
    def add_default(self, val1, val2):
        return self.num + val1 + val2

我现在实例化这些对象,然后尝试使用numba编译其方法。当实例方法不使用任何对象的属性时,此方法有效

from numba import jit

a = Adder(num=1)
print(a.add(7, 8)) # 15
add_fast = jit(a.add)
print(add_fast(7, 8)) # 15

但是,当我尝试使用需要类属性的方法时,这会中断

from numba import jit

a = Adder(num=1)
print(a.add_default(7, 8)) # 16
add_default_fast = jit(a.add_default)
print(add_default_fast(7, 8)) # NotDefinedError: Variable 'self' is not defined.

我尝试使用lambda函数,但仍在内部引用该类并中断jit。理想情况下,我想提取实例方法以及所有实例属性的值,并构建一个新函数,将所有self.变量替换为实例属性中的值。

是否有一种简单的方法?我希望找到一种不涉及重构类的解决方案。

假设我得到了一个Python类的实例。该类具有一个函数,我想从该类中提取并隔离该函数。最终功能需要访问...

python oop instance-variables numba
1个回答
0
投票

尝试一下:

def add_default(a,*args):
    return Adder.__dict__['add_default'](a,*args)

add_default_fast = jit(add_default,forceobj=True)
print(add_default_fast(a,7, 8)) # 16
© www.soinside.com 2019 - 2024. All rights reserved.