【问题标题】:writing a class decorator编写类装饰器
【发布时间】:2021-01-28 08:38:42
【问题描述】:

我有一个类,它有一个名为 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):

我不断收到错误消息,Vectorize 对象不可调用。有没有其他方法可以做到这一点?谢谢

【问题讨论】:

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

标签: numpy python-decorators


【解决方案1】:

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

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):

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2011-10-05
    • 2011-03-19
    • 1970-01-01
    • 2011-12-26
    • 2015-03-24
    相关资源
    最近更新 更多