在python中检查包装属性

时间:2017-11-23 21:25:34

标签: python decorator

我使用以下装饰器对属性进行延迟评估(基于thisthis个问题):

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是常规的,而f2f3是懒惰属性而不调用它们?对于方法,@wraps(fn)应设置__wrapped__属性,但属性不会发生。

我需要这样写一些" pre-fetching"方法,将评估所有"懒惰"属性一次(即缓存所有必要的数据)。事实上,"强力解决方案"将所有名称硬编码为列表,但这在将来的开发中不易维护 - 当添加新的lazy-or-not属性和/或基于对更好的理解更改属性的类型时用例。

0 个答案:

没有答案