问题描述
我遇到以下Python问题:
我有一个具有彼此依赖的不同属性的类。如果在运行时更改属性,则某些属性也应更改。我知道getters
和@property
装饰器。
但是,在这种特殊情况下,某些属性需要花费很长的时间才能计算出来,因为它们涉及数值求解一些积分。我不想在每次调用时都重新计算它们,因为这会使代码效率很低,而是检测其他属性的更改,并仅在需要时重新计算。
class MyClass
def __init__(self,a):
self.a = a
self.b = None
@property
def b():
if b is not None:
return b
else:
self.compute_b() # takes a long time.
return b
def compute_b(self):
# compute b using self.a
self.b = b
所以我想做的是检测某些属性的更改,然后将依赖属性重置为None
并仅在需要时重新计算它们。
我提出了一些想法,但我对其中任何一个都不满意。我将再次使用a
和b
作为各个属性的名称。
使用@property
每次调用b
时都要重新计算。从概念上讲,这是最简单的解决方案,但也是最慢的解决方案。
为setter(a)
写一个a
我可以做到。但是,某些属性是从其他类继承的。因此,我将不得不在派生类中编写setters
,这似乎有些奇怪。我觉得这样会使代码的可读性大大降低,并且可能会以意外的方式运行。
超载__setattr__
如果__setattr__
已更改,则可以在我的课程中重载b
并在此特殊方法内重置a
。但是,我读到这不是一个好习惯。例如。如果按错误的顺序初始化属性,即使不需要,我也可能会重置它们。
在计算a
时制作b
的副本。
在计算a
时制作b
的副本。返回预先计算的b
之前,请检查a
是否已更改。计算b
时基本上设置标志。
使用@functools.lru_cache
[https://docs.python.org/3/library/functools.html#functools.lru_cache]
这看起来也很有希望,但是,似乎我必须将参数传递给我的方法才能使其工作,并且我不想这样做,因为需要许多属性。否则,首先使用类是没有意义的。
我觉得我可以使这些想法中的任何一个都可行,但是似乎都不是最优的。
有人知道如何以一种更清洁的方式解决这个问题吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)