检测python类中的属性更改以获取计算量大的依赖属性

问题描述

我遇到以下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并仅在需要时重新计算它们。

我提出了一些想法,但我对其中任何一个都不满意。我将再次使用ab作为各个属性名称

使用@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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...