当属性丢失时,python调用set属性

时间:2014-04-14 08:35:43

标签: python

我有一个对象,它有几个属性,包含需要一段时间才能查询的值。所以我不想在创建实例时获取这些属性的所有值,但是当代码路径实际需要属性时,因为根据代码路径只需要几个属性。当我到达代码中的某些点时的顺序也不是很确定,所以我不能将属性设置在脚本中的固定点。所以我打算创建一个方法

def getValue(self, attributeName):
    if hasattr(self, attributeName): 
        return getattr(self, attributeName)
    elif attributeName == 'A1':
        v = ... code to get value for A1
        self.A1 = v
        return v
    elif attributeName == 'A2':
        v = ... code to get value for A2
        self.A2 = v
        return v
    ....

但是我想知道这是否真的是一种处理这个问题的好方法,或者是否有更聪明的方法可供选择。 感谢您的任何评论

2 个答案:

答案 0 :(得分:2)

你可以使用这个装饰器:

class cached_property(object):
    """Define property caching its value on per instance basis.
    Decorator that converts a method with a single self argument into a
    property cached on the instance.
    """
    def __init__(self, method):
        self.method = method

    def __get__(self, instance, type):
        res = instance.__dict__[self.method.__name__] = self.method(instance)
        return res

Here是一种解释。

答案 1 :(得分:1)

您可以像这样使用python properties

class Foo:
    def __init__(self):
        # ordinary attributes
        self.B1 = something
        self.B2 = something_else

    @property
    def A1(self):
        try:
            return self._A1
        except AttributeError:
            self._A1 = ....calculate it....
            return self._A1

然后你可以:

foo = Foo()
print foo.A1  # attribute calculated when first used
print foo.A1  # this time, the value calculated before is used