我使用以下装饰器对属性进行延迟评估(基于this和this个问题):
from functools import wraps
def lazy_property(fn):
name = '_lazy_' + fn.__name__
@property
@wraps(fn)
def wrapper(self):
if not hasattr(self, name):
setattr(self, name, fn(self))
return getattr(self, name)
return wrapper
然后在某些课程中,我混合常规和"懒惰"属性:
class A(object):
@property
def f1(self):
return 1
@lazy_property
def f2(self):
return 2
@lazy_property
def f3(self):
return 3
有什么方法可以说明f1
是常规的,而f2
和f3
是懒惰属性而不调用它们?对于方法,@wraps(fn)
应设置__wrapped__
属性,但属性不会发生。
我需要这样写一些" pre-fetching"方法,将评估所有"懒惰"属性一次(即缓存所有必要的数据)。事实上,"强力解决方案"将所有名称硬编码为列表,但这在将来的开发中不易维护 - 当添加新的lazy-or-not属性和/或基于对更好的理解更改属性的类型时用例。