【发布时间】:2017-07-21 11:26:51
【问题描述】:
我想创建一个属性装饰器,它在对象初始化时计算一次属性值,而不是每次访问属性时。例如:
class Foo:
def __init__(self, value):
self.value = value
@cached_property # How to implement this decorator?
def foo(self):
return self.value * some_heavy_computation()
我希望这相当于:
class Foo:
def __init__(self, value):
self.value = value
self._foo = self.value * some_heavy_computation()
@property
def foo(self):
return self._foo
是否可以从方法装饰器中以某种方式将代码添加到__init__()?
【问题讨论】:
-
在评估方法装饰器时,该类本身还不存在,因此您无法查找其
__init__方法来修改它,即使它已经定义(这不是你可以指望的)。但是,您可以编写一个装饰器,它只在第一次调用包装函数,将值保存在实例变量中,然后只返回缓存的值。 -
为什么你认为你需要向
__init__添加代码?你应该阅读descriptor protocol。 -
@jasonharper 我不能得到相同的
cls的__init__并用修补过的__init__替换它吗?假设我假设__init__总是在其他方法之前定义。 -
什么课?在其定义的整个主体(包括所有修饰的方法)完成执行之前,没有类。
-
你的例子没有解释为什么这甚至是必要的;你能提供一些更合适的上下文吗?这似乎是xyproblem.info
标签: python python-3.x decorator python-decorators syntactic-sugar