我正在写一个应用程序来收集和显示科学仪器的数据。数据的一部分是频谱:本质上只是一个值列表,外加一个包含一些元数据的字典。一旦应用程序收集了数据,它就不会改变,所以列表和元数据都可以被认为是不可变的。在
我想利用这一点,通过大量地记忆执行频谱计算的函数。下面是一个玩具的例子:
class Spectrum(object):
def __init__(self, values, metadata):
self.values = values
self.metadata = metadata
# self.values and self.metadata should not change after this point.
@property
def first_value(self):
return self.values[0]
def multiply_by_constant(self, c):
return [c*x for x in self.values]
def double(self):
return self.multiply_by_constant(2)
我想要的是这些方法中的每一个在默认情况下都被记住。有什么方法(元类?)在不复制one of these memoization decorators和到处写@memoize
的情况下完成这项工作?在
我把fridge的回答改为:
decorator是提前知道的,所以我不需要在对象本身中指定它。我也只关心方法,尽管由于我还不明白的原因,当}之类的方法做任何操作。在
Immutable.__new__
看到它们时,对象的所有方法都是未绑定的,因此它们是函数,而不是方法。我还排除了名称以下划线开头的方法:在记忆的情况下,您不希望对__init__
或{我继续写了一个元类来解决你的问题。它遍历所有属性并检查它们是否可调用(通常是函数、方法或类),并修饰那些可调用的属性。当然,您可以将
decorator
设置为您的记忆装饰器(例如functools.lru_cache
)。在如果您只想修饰方法,而不是任何可调用的方法,那么可以将测试
hasattr(val, "__call__")
替换为inspect.ismethod(val)
。但它可能会在将来引入一个bug,你不记得它只适用于方法,并添加了一个函数或类,而这些都不会被记住!在有关Python中元类的更多信息,请参见thisSO question。在
相关问题 更多 >
编程相关推荐