【发布时间】:2016-12-06 09:56:25
【问题描述】:
我想要一个具有attr 属性的类,当第一次访问它时,它运行一个函数并返回一个值,然后变成这个值(它的类型改变,等等)。
可以通过以下方式获得类似的行为:
class MyClass(object):
@property
def attr(self):
try:
return self._cached_result
except AttributeError:
result = ...
self._cached_result = result
return result
obj = MyClass()
print obj.attr # First calculation
print obj.attr # Cached result is used
但是,.attr 在执行此操作时不会成为初始结果。如果这样做会更有效率。
一个难点是obj.attr被设置为一个属性后,就不能轻易的设置为别的了,因为无限循环自然会出现。因此,在上面的代码中,obj.attr 属性没有设置器,因此不能直接修改。如果定义了 setter,则在此 setter 中替换 obj.attr 会创建一个无限循环(从 setter 内部访问 setter)。我还想过首先删除 setter,以便能够使用del self.attr 执行常规self.attr = …,但这会调用属性删除器(如果有),这会重新创建无限循环问题(在任何地方对self.attr 的修改通常都倾向于通过属性规则)。
那么,有没有办法绕过属性机制并将绑定的属性obj.attr 替换为MyClass.attr.__getter__ 内的任何东西?
【问题讨论】:
标签: python properties attributes