Numpy 编写类装饰器

Numpy 编写类装饰器,numpy,python-decorators,Numpy,Python Decorators,我有一个类,它有一个名为my_func(x,s,n)的方法。我需要矢量化这个函数。也就是说,我希望能够传递x=[3,4,5,6,7]或任何范围的值,它会给我一个结果。我正在使用numpy,通过查看这里,我找到了一个有效的解决方案。但是,我想让它成为面向对象的。我试过这个: class Vectorize: """vectorization wrapper that works with instance methods"""

我有一个类,它有一个名为my_func(x,s,n)的方法。我需要矢量化这个函数。也就是说,我希望能够传递x=[3,4,5,6,7]或任何范围的值,它会给我一个结果。我正在使用numpy,通过查看这里,我找到了一个有效的解决方案。但是,我想让它成为面向对象的。我试过这个:

class Vectorize:
    """vectorization wrapper that works with instance methods"""
    def __init__(self, otypes=None, signature=None):
        self.otypes = otypes
        self.sig = signature

    # Decorator as an instance method
    def decorator(self, fn):
        vectorized = np.vectorize(fn, otypes=self.otypes, signature=self.sig)

        @wraps(fn)
        def wrapper(*args, **kwargs):
            return vectorized(*args, **kwargs)
        return wrapper
@Vectorize(signature=("(),(),(),()->()"))
def my_func(self, k: int, s: float, n: int):
然后我尝试了这个:

class Vectorize:
    """vectorization wrapper that works with instance methods"""
    def __init__(self, otypes=None, signature=None):
        self.otypes = otypes
        self.sig = signature

    # Decorator as an instance method
    def decorator(self, fn):
        vectorized = np.vectorize(fn, otypes=self.otypes, signature=self.sig)

        @wraps(fn)
        def wrapper(*args, **kwargs):
            return vectorized(*args, **kwargs)
        return wrapper
@Vectorize(signature=("(),(),(),()->()"))
def my_func(self, k: int, s: float, n: int):

我一直收到一个错误,矢量化对象不可调用。还有别的办法吗?谢谢

我设法解决了这个问题。但是,既然您已经说过签名会降低性能,我正在考虑另一种解决方案。对于那些好奇的人:

class Vectorize:
"""vectorization decorator that works with instance methods"""
def vectorize(self, otypes=None, signature=None):
    # Decorator as an instance method
    def decorator(fn):
        vectorized = np.vectorize(fn, otypes=otypes, signature=signature)

        @wraps(fn)
        def wrapper(*args, **kwargs):
            return vectorized(*args, **kwargs)
        return wrapper
    return decorator

class CustomClass:
    v = Vectorize()
    
   @v.vectorize(signature=("(),(),(),()->()"))
   def my_func(self, k: int, s: float, n: int):

在您在这个项目上投入太多时间之前,请注意性能免责声明。使用
signature
会进一步降低性能。
np.vectorize
可以直接用作装饰器,尽管我不知道如何提供
otypes
sig
值<代码>部分可能会有所帮助,但我没有与装饰师合作过多少。它是python代码(或者至少在过去是),但我不知道它在
github
存储库中的位置。但我怀疑这纯粹是一个装饰程序代码问题,而不是具体的
numpy