我有一个对象,它有几个属性,包含需要一段时间才能查询的值。所以我不想在创建实例时获取这些属性的所有值,但是当代码路径实际需要属性时,因为根据代码路径只需要几个属性。当我到达代码中的某些点时的顺序也不是很确定,所以我不能将属性设置在脚本中的固定点。所以我打算创建一个方法
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
....
但是我想知道这是否真的是一种处理这个问题的好方法,或者是否有更聪明的方法可供选择。 感谢您的任何评论
答案 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